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