Was ist der Unterschied zwischen objectForKey
y valueForKey
? Ich habe in der Dokumentation nachgeschaut, und sie scheinen mir gleich zu sein.
Antworten
Zu viele Anzeigen?objectForKey:
ist eine NSDictionary
Methode. Eine NSDictionary
ist eine Sammelklasse ähnlich einer NSArray
mit dem Unterschied, dass es anstelle von Indizes Schlüssel verwendet, um zwischen den Elementen zu unterscheiden. Ein Schlüssel ist eine beliebige Zeichenkette, die Sie angeben. Keine zwei Objekte können den gleichen Schlüssel haben (genauso wie keine zwei Objekte in einer NSArray
können den gleichen Index haben).
valueForKey:
ist eine KVC-Methode. Sie funktioniert mit JEDER Klasse. valueForKey:
ermöglicht den Zugriff auf eine Eigenschaft mit einer Zeichenkette als Namen. Wenn ich also zum Beispiel eine Account
Klasse mit einer Eigenschaft accountNumber
kann ich Folgendes tun:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
Mit KVC kann ich dynamisch auf die Eigenschaft zugreifen:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Dies sind gleichwertige Sätze von Aussagen.
Ich weiß, dass Sie denken: "Wow", aber das war sarkastisch gemeint. KVC sieht gar nicht so nützlich aus. Tatsächlich sieht es "wortreich" aus. Aber wenn Sie Dinge zur Laufzeit ändern wollen, können Sie viele coole Dinge tun, die in anderen Sprachen viel schwieriger sind (aber das geht über den Rahmen Ihrer Frage hinaus).
Wenn Sie mehr über KVC erfahren möchten, gibt es viele Anleitungen, wenn Sie googeln, insbesondere unter Der Blog von Scott Stevenson . Sie können sich auch die NSKeyValueCoding Protokoll-Referenz .
Ich hoffe, das hilft.
Wenn Sie das tun valueForKey:
müssen Sie ihm einen NSString geben, während objectForKey:
kann jede NSObject-Unterklasse als Schlüssel verwenden. Der Grund dafür ist, dass bei der Schlüssel-Wert-Kodierung die Schlüssel immer Strings sind.
In der Dokumentation heißt es nämlich, dass selbst wenn Sie valueForKey:
einen NSString, ruft es auf objectForKey:
es sei denn, die Zeichenkette beginnt mit einem @
und ruft in diesem Fall Folgendes auf [super valueForKey:]
die Folgendes aufrufen können valueForUndefinedKey:
was eine Ausnahme auslösen kann.
Wie gesagt, die objectForKey:
Datentyp ist :(id)aKey
während die valueForKey:
Datentyp ist :(NSString *)key
.
Zum Beispiel:
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.
Also, valueForKey:
nimmt nur einen String-Wert an und ist eine KVC-Methode, während objectForKey:
kann jede Art von Objekt annehmen.
Der Wert in objectForKey
wird durch dieselbe Art von Objekt zugegriffen werden.
- See previous answers
- Weitere Antworten anzeigen