【Objective-C】プロパティ属性のreadonlyがあっても値を変更できてしまうケースから学ぶsetter【Xcode10.2対応】
こういう人に向けて発信しています。
・Objective-CのreadOnlyを学んでいる人
・プロパティ属性について学んでいる人
・後回しにしてきた中級者
そもそもプロパティ属性 readonlyとは
読み取りのみ可能。そして対比としてreadwriteがあり、
こちらは読み書き可能。そういう認識だと思います。
ただし、厳密には自動でsetterを作らないというのが正しいです。
なので手動でsettterを作ってあげましょう。
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,readonly) NSString *testString;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_testString = @"text01";
self.testString = @"text02";
}
//こちらをコメントアウト解除すれば、readOnlyで宣言しているのに書き込めてしまう。
-(void)setTestString:(NSString *)testString{
_testString = testString;
}
@end
上記コードであればプロパティ属性でreadonlyを宣言しているにも
関わらず、setterを自前で用意しているので値を変える事ができます。
setterをコメントアウトすれば、
self.testString = @"text02";
上記1行がエラー出てビルドできません。
当然ですね。readonlyに書き込もうとしてるので。
(setterを用意していないのに、ということです)