id型 - shirai/SwiftLearning GitHub Wiki
型
Objective-Cにおける型の扱い
目標
- 詳解Objective-C2.0 「静的な型チェックまとめ(p68)」の内容が理解できている
わかったこと
- id型として宣言した変数に対しては、どのメソッド呼び出しも(実際に動作するかは別として)記述できる 例)id *n; [n addObserver:self selector:@selector(hoge:) name:@"notification" object:nil]; と記述できる(実行はできない)
- id型として宣言した変数と、クラス名を型として宣言した変数の間では、相互に代入が行える 例)id *n; NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; n = nc; これができる
- クラス名を型として変数宣言すると、そのクラスが対応できる以外のメソッド呼び出しには警告が出される 例)NSString *a; [a addObserver:self selector:@selector(hoge:) name:@"notification" object:nil]; addObserver以下はNSNotificationCenterのメソッドのため警告が出る
- クラス名を型とした変数には、そのクラスのサブクラスを型とする変数から代入を行っても良い 例)NSString *a = @"A"; NSMutableString *b = [NSMutableString stringWithString:@"B"]; a = b; NSLog(@"%@",a); NSMutableStringはNSStringのサブクラスなので代入が行える(この場合コンソールにBと表示される)
- クラス名を型とした変数には、そのクラスのスーパークラスを型とする変数から代入してはいけない 例)NSString *a = [NSString string]; NSMutableString *b = [NSMutableString string]; b = a; サブクラスだけにあるメソッドの呼び出しに、スパークラスのインスタンスは対応できないため警告が出る
- プログラム上の字面に関係なく、実行時には実際に変数に格納されているオブジェクトのメソッドが使用される 例)NSString *a = [NSMutableString string]; [a appendString:@"hoge"];
- id型はNSObject型ではない
わからなかったこと
- 「プログラム上の字面に関係なく、実行時には実際に変数に格納されているオブジェクトのメソッドが使用される」のいい例が思い浮かばなかった
- 「id型はNSObject型ではない」ことはわかったが、実際にどう違うのかがわからなかった
つぎにやること
■詳解Objective-C2.0 「静的な型チェックまとめ(p68)」の読み込み ■学習まとめ作成 ■実際にNSStringとNSMutableStringで試す