7

lastName および firstName 属性を含むエンティティがあります。この質問の範囲を超えた理由で、firstName + space + lastName の連結として計算される fullName 属性が必要です。

これは純粋に計算された値であり、やり直し/元に戻す、または一時的な属性のその他のより高度な側面 (マージなど) は必要ないため、getter メソッドをオーバーライドして計算された値を返すように指示されます。これを行う場合、唯一の懸念は KVO に準拠しているかどうかであり、keyPathsForValuesAffectingVolume を使用して、firstName または lastName への変更が fullName を監視しているすべての人に通知をトリガーするようにすることで対処できます。

何か不足していますか?私はこの環境の初心者なのでチェックしています。

4

1 に答える 1

2

私もこれに慣れていないので、私の答えについては完全にはわかりませんが、私が理解しているように、あなたは正しいです。

- (NSString *)fullName
{
    [self willAccessValueForKey:@"fullName"];
    NSString *tmp = [self primitiveFullName];
    [self didAccessValueForKey:@"fullName"];

    if (!tmp) {
        tmp = [NSString stringWithFormat:@"%@ %@", [self firstName], [self lastName]];
        [self setPrimitiveFullName:tmp];
    }
    return tmp;
}

- (void)setFirstName:(NSString *)aFirstName
{
    [self willChangeValueForKey:@"firstName"];
    [self setPrimitiveFirstName:aFirstName];
    [self didChangeValueForKey:@"firstName"];

    [self setPrimitiveFullName:nil];
}

- (void)setLastName:(NSString *)aLastName
{
    [self willChangeValueForKey:@"lastName"];
    [self setPrimitiveLastName:aLastName];
    [self didChangeValueForKey:@"lastName"];

    [self setPrimitiveFullName:nil];
}

+ (NSSet *)keyPathsForValuesAffectingFullName
{
    return [NSSet setWithObjects:@"firstName", @"lastName", nil];
}
于 2011-05-17T18:05:25.947 に答える