はじめに
私はObjective-c に出会う前まではJava、C#をメインに開発を行っていました。
そのため、プロパティは他の言語でも使用していたため特に違和感はありませんでした。
しかし、オプションという概念だけは他の言語と比べて重要であり避けては通れない知識であると感じたため、改めて理解を深める意味も含めて纏めたいと思います。
お願い
人に読んでもらえるような記載にはなっていない点や自己都合で省略している点もありますので、参考にされる方がいらっしゃいましたら、よく理解した上で再検証して頂ければと思います。
オプション(アクセサー名の指定: setter=)
- getter=
- setter=
このオプションは一度も使ったことがありません。
そのため念のため、検証してみました。
結果から先に書いておきます、以下のコードのままでは実行時エラーとなります。
// Person.h
# import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *name1;
@property (setter=fullName:) NSString *name2;
@end
// ViewController.m
# import "ViewController.h"
# import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
// ------ 一部省略 ------ //
# pragma mark -
// プロパティ実験(アクセサー名の指定)
- (IBAction)tapPropertiesTestByAccessorName:(id)sender {
Person *person = [[Person alloc] init];
// OK
person.name1 = @"ネーム";
// OKのはず
[person fullName:@"フルネーム"];
}
@end
調査しました
元々の想像(指定した名前でビルド時にセッターが生成される)とは違い、
このオプションは明示的にアクセッサメソッドを指定出来るというものでした。
そのため、以下のコードを追加してあげることによって期待した動作になりました。
無限ループになるコードは日常では無意識で回避していたようで遭遇しませんでしたが、
今回はあえて試してみたところ想定通りの動作となりました。
// Person.m
# import "Person.h"
@implementation Person
-(void)fullName:(NSString*)value {
//self.name2 = value; : NG 無限ループします
_name2 = value;
}
@end
ちなみに以下のようなコードを記載しても先ほど指定したセッター経由でデータが引き渡されるようになります。
person.name2 = @"フルネーム2";
備考
地味な検証ではありましたが、過去の経験則から考えるとこのような細かい調査の積み重ねは継続が大事なので不定期にはなると思いますが思いついた時に少しずつ書き溜めたいと思います。
またサンプルコードのままでは警告が表示されているので、少しずつ確認も含めて調査したいと思います。