クラスメソッドかインスタンスメソッドか


AppleScriptObjC に関しては、風のウワサで「何でもできるよ!」と聞いてはいたのですが、Cocoa/Objective-C と AppleScript の両方やっている身からすると、触っていくうちにそこかしこで「え? Cocoa のあれどうやってやるの?」という場面に遭遇します。

ふと思ったのが、AppleScript のクラスでどうやってクラスメソッドを定義するのか ということです。ひとまずの結論としては、クラスメソッドとして呼びたければそのように、インスタンスメソッドとして呼びたければそのように呼べばいい ようです。

サンプルコード

ClassMethodOrInstanceMethodScreenSnapz001

説明

このサンプルコードでは、まず CMGhost というくらすを AppleScript で書いています。このクラスは、パラメータとして文字列を受け取り、標準アラート(NSAlert)でそれを表示する、という単純なハンドラ(メソッド)identifyWithMessage_() を持つのみの簡単なものです。

ビルドして起動すると、3つのボタンがウィンドウに並んでいます。最初の「AppleScript」では、前述の identifyWithMessage_() を, 最初はクラスメソッドとして、その後インスタンスメソッドとして呼び出します。「Objective-C」も処理内容は同じですが、Objective-C ベースで呼び出しています。最後の「Dump Methods」ボタンでは、CMGhost クラスの持つメソッドを PPDumper クラスを用いてダンプしています。

実行結果は、AppleScript でも Objective-C でも、ひとつのメソッドをクラス/インスタンス両方のメソッドとして呼び出せる、というものになると思います。

その他

このサンプルコードでは、以下の項目も参考になるかもしれません。

AppleScriptObjC におけるクラスの参照の仕方

ClassMethodOrInstanceMethodAppDelegate.applescript で確認することができます。

AppleScriptObjC では、クラス(オブジェクト?)は current application の持ち物になっています。そのままだと非常に冗長になっていますので、サンプルコードのように、あらかじめトップレベルのプロパティとして持っておくと、多少すっきりするかもしれません。

さらにサンプルコード内の _class() ハンドラの用なものを作ろうとする方がいらっしゃるかもしれませんが、それはできません。なぜなら、return された後はインスタンス化されてしまうからです(この辺は今回のテーマにも関連しそうですが、あまり深入りしないことにしました…おい)。

可変引数を持ったメソッドの呼び出し

今回 CMGhost クラスでは、テキストの表示に display dialog コマンドではなく、Cocoa のクラス NSAlert を使用しています。

NSAlert にはインスタンスを生成するための長ったらしいクラスメソッドがあるのですが、これの最後で文字列フォーマットを指定できるようになっています。これはどうやるのかというと… そのまま です。ちなみに、missing valuenil です。


“クラスメソッドかインスタンスメソッドか” への2件のフィードバック

  1. やっと10.6をインストールして、昨晩からXCodeをいじり始めていきなり挫折。 検索の結果、こちらにお邪魔しました。

    AppleScriptObjC・・・情報少なすぎ。

    こちらは貴重な情報源。ありがとうございます。 わからないながらも参考にさせていただきながら、AppleScriptObjCをいじってみようかと思います。 今後ともよろしくお願いいたします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です