私はそれについて他のいくつかのトピックを読みましたが、それでも私は迷っています.
「読み取り専用」プロパティのみを持つ不変オブジェクトと、「読み取り書き込み」プロパティのみを持つ可変オブジェクトの 2 種類のオブジェクトを作成したいと考えています。
それらを EXCar と EXMutableCar と呼びましょう。
EXCar は NSObject のサブクラスで、EXMutableCar は EXCar のサブクラスです。
ExCar はそのインターフェースに
@property (nonatomic, strong, readonly) NSString *name;
EXMutableCar はそのインターフェースに
@property (nonatomic, strong) NSString *name;
そのため、サブクラスの EXMutableCar を使用するときに、EXCar のプロパティを「開きます」。そして、それは可変です。問題は、それらの間で適切にコピーすることです。
EXCar に mutableCopyWithZone を実装しました:
- (id)mutableCopyWithZone:(NSZone *)zone {
EXMutableCar *mutableCopy = [[EXMutableCar allocWithZone:zone] init];
mutableCopy.name = _name;
return mutableCopy;
}
最初の質問、それは良い方法ですか?(ツバメコピーが欲しい)
問題は copyWithZone にあります。EXCar のプロパティは読み取り専用であるため、EXCar でも EXMutableCar でも EXCar の新しいインスタンスを作成して、そのプロパティを次のように入力することはできません。
- (id)copyWithZone:(NSZone *)zone {
EXCar *copy = [[EXCar allocWithZone:zone] init];
copy.name = _name; // This can't work...
return copy;
}
そして、15 個のプロパティを渡す "init" メソッドを実際に実行したくはありません (確かに、EXCar は一例です。実際のクラスは多くのプロパティでいっぱいです)。また、通常はサーバーからの JSON メッセージから開始されるため、複雑な init メソッドは必要ありません。
2番目の質問はそうです、私のクラスを不変に保つ copyWithZone を行う方法は?
ご協力いただきありがとうございます :)