Różnica między objectForKey a valueForKey?
Jaka jest różnica między objectForKey
a valueForKey
?
Sprawdziłam obie w dokumentacji i wydawały mi się takie same.
4 answers
objectForKey:
jest metodą NSDictionary
. An NSDictionary
jest klasą kolekcji podobną do an NSArray
, z tym, że zamiast używać indeksów, używa kluczy do rozróżniania elementów. Klucz to dowolny ciąg znaków, który podajesz. Żadne dwa obiekty nie mogą mieć tego samego klucza (tak jak żadne dwa obiekty w NSArray
nie mogą mieć tego samego indeksu).
valueForKey:
jest metodą KVC. Działa z każdą klasą. valueForKey:
umożliwia dostęp do właściwości za pomocą ciągu znaków jej nazwy. Na przykład, jeśli mam klasę Account
z właściwością accountNumber
, mogę zrobić:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
Używając KVC, mogę uzyskać dostęp do właściwości dynamicznie:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Są to równoważne zestawy twierdzeń.
Wiem, że myślisz: wow, ale sarkastycznie. KVC nie wygląda na przydatne. W rzeczywistości wygląda na "wordy". Ale kiedy chcesz zmienić rzeczy w czasie wykonywania, możesz zrobić wiele fajnych rzeczy, które są o wiele trudniejsze w innych językach (Ale to wykracza poza zakres twojego pytania). Jeśli chcesz dowiedzieć się więcej o KVC, istnieje wiele samouczków, jeśli Google szczególnie na Scott Stevenson ' s blog . Możesz również sprawdzić numer Nskeyvaluecoding Protocol Reference. Mam nadzieję, że to pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-28 13:00:41
Kiedy robisz valueForKey:
musisz dać mu NSString, podczas gdy {[1] } może przyjąć dowolną podklasę NSObject jako klucz. Dzieje się tak, ponieważ dla kodowania klucz-wartość, klucze są zawsze ciągami znaków.
W rzeczywistości dokumentacja stwierdza, że nawet jeśli podasz valueForKey:
NSString, wywoła objectForKey:
i tak, chyba że łańcuch zaczyna się od @
, w którym to przypadku wywoła [super valueForKey:]
, co może wywołać valueForUndefinedKey:
, co może wywołać wyjątek.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 08:25:43
Oto świetny powód, aby używać objectForKey:
tam, gdzie to możliwe, zamiast valueForKey:
- valueForKey:
z nieznanym kluczem rzuci NSUnknownKeyException
powiedzenie " ta klasa nie jest zgodna z kodowaniem wartości klucza ".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-30 19:19:26
Jak już wspomniano, typ danych objectForKey:
to :(id)aKey
, podczas gdy typ danych valueForKey:
to :(NSString *)key
.
Na przykład:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil];
NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]);
//This will work fine and prints ( 123 )
NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]);
//it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime.
Tak więc, valueForKey:
przyjmie tylko wartość łańcuchową i jest metodą KVC, podczas gdy objectForKey:
przyjmie dowolny typ obiektu.
Wartość w objectForKey
będzie dostępna dla tego samego rodzaju obiektu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 21:34:34