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.

Author: James Webster, 2009-06-30

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.
 394
Author: Corey Floyd,
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.

 63
Author: dreamlax,
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 ".

 21
Author: Nick Locking,
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.

 12
Author: Harjot Singh,
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