きりかノート 3冊め

おあそびプログラミング

RubyCocoa で Objective-C の型情報をどういうスタイルにする?

ひ日誌 11/03 の「addRubyMethod_withType の構文糖」に反応。

リンク先での主題ではないけれど、型エンコードを使うのって、そもそもどうなんだろう。今は裏道的な扱いだけれど、オープンにガンガン使うには型エンコードってわかりにくいと思うのだ。

たとえば例に挙がっている

 def foo_bar(view, index)
end
objc_form 'foo:bar:', '@@:@I'

は、こんなほうがよいだろう。

 objc_form 'foo:bar:', 'NSObject *', 'NSView *', 'int'
# seems -> -(NSObject *) foo:(NSView *)aView bar:(int)index
# or
objc_form 'foo:bar:', 'id', 'id', 'int'

冗長ではあるけれど、コードを書く人にも読む人にもこういった形式のほうがやさしい。型エンコードを利用した設定も objc_form_ocencode とか長い名前のメソッドで利用できてもよい。

おそらく BridgeSupport の機能を利用して parse できるので、それを利用すれば処理も簡単にできるし、さらに BridgeSupport に登録もできるので型変換が正確に行われる。

ここでのポイントは、

  • 型情報には Cの型をそのまま使う
  • レシーバとセレクタは省略する

つまり、結果的に Objective-C のメソッド定義と同じように書けるっていうこと。

Rubyの型を定数的に利用する、こういうのもありかも。

 objc_form 'foo:bar:', OSX::NSObject, OSX::NSView, Integer