クラスに関しては→こちら
2012-03-09
オブジェクトを入れる専用のidという型がある。
id hoge;
なんかオブジェクトはなんでもこの型にはいるらしい
つまりほかの言語ならばnew
にあたる処理。
Objective-Cではクラスオブジェクトのallocメソッドを呼び出して生成する。
[ Hoge alloc ];
構文としてこうなのかクラスの静的メソッド呼び出しなのかはわからんがこうなっている。
作成と初期化が分離して実装されているので・・・
[ [Hoge alloc] init ];
このように生成と初期化をチェーンして書くのが普通。 初期化メソッドは慣例的に大体initで、内部的にはNSObjcetのinitまでチェーンしてオブジェクトが生成される。
Objective-Cではオブジェクトのメソッドを呼ぶことをメッセージと言う。 ややこしいがメソッドは実装そのものでメッセージはそれを呼ぶ行為ということみたいだ。知るか!
hoge変数の中に入っているオブジェクトのpiyoメソッドを呼ぶ。つまり実行するには、
[ hoge piyo ];
と書く・・・キモくて読みにくいことこの上なし。
piyoメソッドに引数1を1個与えて呼び出すならこうなる。
[ hoge piyo : 1 ];
コロンに続いて引数を書く
2個引数を与えたい時は
[ hoge piyo : 1 : 2 ];
このようにコロンでセパレートしてズラズラ書く
ラベル付き引数と書いたが、概念的には違うっぽくて、変数にラベルを付けるのではなく、 Javaの引数違いによる自動的なメソッド選択であるオーバーロードをメソッド名に練り込んでしまおうという発想のようだ。
Javaでも結局ポリモフィズムを使ってもメソッド名に引数を表すものが入るなら
Hoge a = hoge.findByHogeIdAndPiyoId(123, 456);
のようになるね。
これをObjective-C風に書き換えると・・・
Hoge a = [ hoge findByHoge:123 piyoId:456 ];
このようにfindByHoge
が第一引数で基本挙動をしてさらに追加オプションでpiyoId
を取るというメソッドになるという考え方のようだ。
同じfindByHogeでもpiyoIdのが付くことによって別のメソッドとして扱われる。なのでこのpiyoIdみたいなラベルをセレクタと呼ぶ。