RubyMotion における Objective-C インスタンスメソッドのモデリング

先日、RubyMotion を買った。iOS SDK を触ったことはないけど、ドキュメントを見て適当に Ruby のコードにらくらく変換できるかなという淡い期待があった。そんなことは無かったけど、楽しくやっていきたい。

メソッドはオブジェクトに対するメッセージとされ、[Object message];みたいな感じで呼び出しできる。角括弧での記法によるメソッド呼び出しが面白いのは置いといて、メッセージセレクタが独特だと思った。

motion create App でデフォルトで生成される AppDelegate のインスタンスメソッドである
application(application, didFinishLaunchingWithOptions:launchOptions)

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

と定義されているみたい。 application で始まる同名メソッドがたくさん定義されているのがよく分からなくて、渋々 Objective-C の入門サイトを見ていたら、この定義の解釈は

application_didFinishLaunchingWithOptions( application, launchOptions )

とすると分かりやすいみたいだ(http://blog.livedoor.jp/faulist/archives/904887.html)。

Objective-C におけるメッセージの送信(呼び出し?)はメッセージ式を使って

[string drawAtPoint:point withFont:font];

と書く。先の解釈だと Ruby では string.drawAtPoint_withFont( point, font ) みたいなことになりそうだけど、 RubyMotion ではメッセージ式に似せたモデリングをしており、

string.drawAtPoint(point, withFont:font)

となる。send を使って

string.send(:'drawAtPoint:withFont:', point, font)

とすることもできるみたいだ。メッセージを送信してる感覚が増す。面白い。