<Prev
index
Next>

■Objective-Cメソッドを呼ぶ

Cで書かれた関数をAppleScriptに移植した経験はないでしょうか?面倒ですね。

科学計算やインターネットでのコード変換など、Cの関数をそのまま使うことができれば、どんなに楽でしょうか。

また、現在AppleScriptで実装されていない機能を使いたい場合、OSAXをつくらなければならなかったのですがObjective-Cのメソッドを呼びだせれば済むようなことは結構あるのではないでしょうか?

AppleScriptのcall methodというイベントを使えばそれが出来ます。


新規プロジェクトを作成します。作成方法はひな型プロジェクトを作るを見てください。
プロジェクト名はcallObjC2としました。

Japaneseのnibファイルをダブルクリックして開きます。
WindowにTextFieldを一つ、Buttonを一つ配置します。

Windowを小さくしておきました。

InfoパネルのAppleScriptから、それぞれ名前をつけておきます。

windowには"wi"

TextFieldには"tf"

Buttonには"bu"
ButtonのEventHandlerのclickedにチェックを入れ、ScriptのApplication.applescriptにもチェックをいれます。

Scriptはあとで作成します。



ObjectiveCのクラスを作成します。
プロジェクトビルダーの「ファイル」メニューから「新規ファイル...」を選んで下さい。

「Objective-C class」を選択し、「次へ」ボタンを押します。

ファイル名を入力します。
通常「クラス名」+.mとつけるようです。
クラス名は大文字ではじまり、単語の頭のみ大文字で他は小文字というのが流儀らしいのでそのようにしました。
Keisan.mとしました。

「同時に"Keisan.h"も作成する」にチェックが入っていることを確認して下さい。
チェックされていればOKです。

プロジェクトに追加します。
「完了」ボタンを押して下さい。

「グループとファイル」にファイルが作成されます。
(別の階層にできてしまったら、ドラッグドロップで「Other Source」フォルダに入れておきましょう。)

まずKeisan.hからです。

+ (NSNumber *) kakezan:(int)suuji1 kakeru:(int)suuji2;


と1行追加します。
くれぐれも{}内には入れないで下さい。
{}内はOutletを記入する所です。

次にKeisan.mです。

+ (NSNumber *) kakezan:(int)suuji1 kakeru:(int)suuji2
{
int u;
u = suuji1*suuji2;

return [NSNumber numberWithShort : u ];

}

を追加します。

それでは、スクリプトの編集です。

Application.applescriptに

-- Application.applescript
on clicked theObject
tell text field "tf" of window "wi"
set a to 3
set b to 2
set contents to call method "kakezan:kakeru:" of class "Keisan" with parameters {a, b}
end tell
end clicked



となるように入力して下さい。

ビルドして実行してみて下さい。
ボタンを押すと
3×2が計算されて6が表示されています。
STOPを押すと終了します。
 


Application.applescriptの
call method "kakezan:kakeru:" of class "Keisan" with parameters {a, b}
で、Objective-Cのクラスを呼び出しています。
Keisanクラスのkakezan:kakeru:というメソッドを呼び出して、パラメータとしてaとbを渡しています。

気をつけなければいけない点は、with parametersの部分で、パラメータが一つの場合はwith parameter、複数の場合はwith parameters {}としなければいけないところです。半日はまってしまいました。


呼び出されたObjective-Cのクラス「Keisan」は、パラメータaをsuuji1とbをsuuji2として受け取り、計算した後NSNumber型の数値として返します。
[NSNumber numberWithShort : u ]
は、int型の数値uを元にNSNumberを作りますよという命令です。

set contents to ...

戻された数値をAppleScriptでTextFieldの内容(contents)としてセットします。

簡単ですが、このようにして、複雑な計算をObjective-Cで処理することができます。


2002.1.10 (C)Satoshi Oomori