2

プロパティが「読み取り専用」として定義され、さまざまなコンポーネント間で共有される「モデル」オブジェクトが多数あります。

場合によっては、オブジェクトのローカルで変更可能なコピーを作成する必要があります (それらをローカルで変更可能な状態に使用します)。

オブジェクトは作成後に不変でなければならないため、NSMutableCopy プロトコルを実装しません。変更されたオブジェクトは、コピー + 変更操作の後に「受け渡される」可能性があります。

提案されたメカニズムはありますか、または「変更された」パラメーターを受け取るコンストラクターを実装する必要がありますか?

たとえば、JSON をネイティブ タイプに解析するオブジェクト:

@interface ImmutableObject : NSObject
// various "readonly" properties
...
-(instancetype)initWithJSON:(NSDictionary *)jsonDictionary;

@property (nonatomic, readonly) MyClass1 *prop1;
@property (nonatomic, readonly) MyClass2 *prop2;
...
@property (nonatomic, readonly) NSArray<MyClass100 *>  *prop100;

@end

@implementation 
-(instancetype)initWithJSON:(NSDictionary *)jsonDictionary {
  self = [super init];
  [self parseDictionaryToNative:jsonDictionary];
  return self;
}
@end

コードのどこか:

ImmutableObject *mutated = [immutableObject mutableCopy]; // best way to accomplish this?
// change some values...
mutated.prop1 = ... // change the value to something new

self.state = [mutated copy]; // save the new object
4

2 に答える 2

1

NSMutableArrayなどは、NSMutableData対応する不変のものとは異なるクラスであることに注意してください。したがって、この場合、MutableObjectクラスと同じインターフェイスImmutableObject(ただし、変更可能なプロパティを持つ) を持つクラスを定義し、変更可能なオブジェクトが必要な場合はそれを使用する必要があります。

MutableObject *mutated = [immutableObject mutableCopy]; // create an instance of MutableObject

mutated.prop1 = ... // change the value to something new

self.state = [mutated copy]; // creates an ImmutableObject

の実装は次のImmutableObject's mutableCopyようになります。

- (MutableObject *) mutableCopy
{
    MutableObject *instance = [MutableObject new];
    instance.prop1 = [self.prop1 copy]; // depends what you want here and what kind of class the properties are... do you need a deep copy? that might be a bit more work.
    // etc...
    return instance;
}

MutableObject's copyメソッドは次のようになります。

- (ImmutableObject *) copy
{
    ImmutableObject *instance = [ImmutableObject new];
    instance.prop1 = [self.prop1 copy];
    // etc...
    return instance;
}

NSMutableCopyこのプロトコルを正式に使用することは強制されていませんが、使用できます。

于 2016-04-03T15:14:52.303 に答える