Objective-C勉強日記(2) クラスの仕組み
2010/01/09
第3回 Objective-Cのクラス定義を理解しよう
Objective-Cのクラス定義を理解しよう – @IT
- インスタンス変数のスコープは、public, protected, public, package。javaと同じ感じ。
- 指定しなかった場合は、protectedになるところは、javaと違うか。
e. 引数が2つと戻り値があるメソッド
- (NSString *)myMethod5:(NSString *)argString myInt:(int)argInt; ↓メソッドの実行例 NSString *result = [test myMethod5:@"test" myInt:5];(snip)
最も特徴的なのは、eでしょう。第2引数に注目してください。int型のargIntという引数を受け取っていることは分かると思います。では、:(コロン)の前に記述されている「myInt」は何を表しているのでしょうか。
Objective-Cのクラス定義を理解しよう – @IT
おー、これは難しい。
上記eのメソッド名は、「myMethod5:myInt:」です。メソッド名には:(コロン)も含まれるため、aのメソッド名は「myMethod1」、cのメソッド名は「myMethod3:」ということになります。
Objective-Cのクラス定義を理解しよう – @IT
なんか、言語のデザインとしてありなんだろうか?
キーワード引数的な機能なんだろうけど、第一引数を特別扱いしすぎじゃないのかと思ってしまう。
分かり易いメソッド名を命名するのを妨げてしまいそうだけど、大丈夫なのかな。
ここで、NSObject.hを見てみると、以下のように、第2、第3の引数のキーワードが同じものを指定してある。
- (id) performSelector: (SEL)aSelector withObject: (id)object1 withObject: (id)object2;
そうか、何となくどう使ってほしいかわかった気がする。常にキーワード引数として呼び出すしか方法が用意されていないのか。
- インスタンスメソッドの定義には、- を付ける。クラスメソッドの定義には+を付ける。
- プロパティとアクセサ。アクセサは、test.myPropのように記述できるが、これは、メッセージ式のメソッド呼び出しのシンタックスシュガーみたいなものらしい。その代わりid型の変数では使用できない。
- コンストラクタのサポートは、最近の言語のようには行かないらしい。基本NSObjectのallocとinitメソッドを使って、インスタンスを生成するようだ。
- 引数のあるコンストラクタを実装したい場合、initの代わりにinitXXXというメソッドを用意するらしい。他の人が作ったクラスのインスタンスを生成する時は、ドキュメントを読めということか。
まとめ
Objective-Cは、想像以上に異質な世界だ。言語の仕組みが、こうなっている理由が今は全然理解できない。Smalltalkの経験が無いからだろうか?
これにめげずに、もうちょっと読み勧めてみたい。