2011-05-17 16 views
7

Mam element zawierający atrybuty lastName i firstName. Z przyczyn wykraczających poza zakres tego pytania chcę, aby atrybut fullName został obliczony jako połączenie imienia i spacji + lastName.Atrybuty obliczane na podstawie danych podstawowych

Ponieważ jest to czysto wyliczona wartość, bez potrzeby ponawiania/cofania lub jakiegokolwiek innego z bardziej wyrafinowanych aspektów przejściowych atrybutów (scalania itp.), Moje jelito mówi, żebym po prostu nadpisał metodę gettera, aby zwrócić obliczona wartość. Czytanie sugeruje, że jeśli to zrobię, moim jedynym zmartwieniem będzie, czy jest to zgodne z KVO, do którego mogę się odnieść za pomocą metody keyPathsForValuesAffectingVolume w celu zapewnienia zmian w powiadomieniach o wyzwalaczach firstName lub lastName dla każdego obserwującego na fullName.

Czy brakuje mi czegoś? Sprawdzam, ponieważ jestem początkującym w tym środowisku.

Wayne

Odpowiedz

2

Jestem również nowy w tym, więc nie jestem całkowicie pewny mojej odpowiedzi, ale jak rozumiem masz rację.

- (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]; 
} 
+0

Cześć Mark. Dziękuję za odpowiedź. Moje jedyne pytanie dotyczy wywołań do [self primitiveFullName: nil] i [self primitiveFullName: tmp]. Jeśli jedynym sposobem, w jaki użytkownik może uzyskać dostęp do twojej wartości, jest getter, a getter zawsze zwraca poprawną wartość, dlaczego interesujesz się tym, co jest przechowywane dla właściwości przejściowej? Proszę zauważyć, podejrzewam, że masz absolutną rację, robiąc to ... Po prostu łowię ryby, żeby zobaczyć, czy brakuje mi jakiejś subtelności. – wayne

+0

Cześć Mark. Również z ciekawości, dlaczego jesteś w stanie użyć formularza: [self setPrimitiveFirstName: aFirstName] do ustawienia pierwotnej wartości, a ja jestem zmuszony użyć formularza: [self setPrimitiveValue: aFirstName forKey: @ "firstName"]? Znów łowię! – wayne

+0

Whoops. Nie zdawałem sobie sprawy, że korzystam z prymitywnegoFullName: zamiast setPrimitiveFullName: –

Powiązane problemy