Quelle est la différence entre objectForKey
et valueForKey
?
J'ai regardé les deux dans la documentation et ils semblaient la même chose pour moi.
Réponses
Trop de publicités?objectForKey:
est NSDictionary
méthode. Un NSDictionary
est une classe de collection similaire à un NSArray
, sauf qu'au lieu d'utiliser des index, il utilise des clés pour différencier entre les éléments. Une clé est une chaîne de caractères arbitraire que vous fournissez. Pas de deux objets peuvent avoir la même clé (comme pas deux objets dans un NSArray
peut avoir le même indice).
valueForKey:
est un KVC méthode. Il fonctionne avec n'IMPORTE quelle classe. valueForKey:
vous permet d'accéder à une propriété à l'aide d'une chaîne de caractères pour le nom. Ainsi, par exemple, si j'ai un Account
classe avec une propriété accountNumber
, je peux faire ce qui suit:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
À l'aide de KVC, je peux accéder à la propriété de façon dynamique:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Ceux-ci sont l'équivalent des ensembles d'états.
Je sais que vous êtes en train de penser: wow, mais de manière sarcastique. KVC ne regarde pas tout ce qui utile. En fait, il semble "verbeux". Mais quand vous voulez changer les choses au moment de l'exécution, vous pouvez faire beaucoup de choses cool que beaucoup plus difficile dans d'autres langues (mais c'est au-delà de la portée de votre question).
Si vous voulez en savoir plus sur KVC, il existe de nombreux tutoriels si vous Google en particulier à Scott Stevenson blog. Vous pouvez aussi consulter les NSKeyValueCoding Protocole de Référence.
Espérons que cela aide.
Lorsque vous effectuez valueForKey:
vous avez besoin de lui donner un NSString, alors qu' objectForKey:
peut prendre n'importe quelle sous-classe NSObject comme une clé. C'est parce que pour la Valeur-Clé de Codage, les touches sont toujours des chaînes de caractères.
En fait, la documentation indique que, même quand vous donnez valueForKey:
un NSString, il appellera objectForKey:
de toute façon, sauf si la chaîne commence par un @
, auquel cas il invoque [super valueForKey:]
, qui peut appeler, valueForUndefinedKey:
qui peut lever une exception.
Il y avait tellement de bonnes réponses sont affichées. Je veux juste ajouter que mes idées pour aider les autres avec l'utilisation de simple exemple.
Comme l'a dit, objectForKey:
type de données est - :(id)aKey
alors qu' valueForKey:
type de données est - :(NSString *)key
.
Exemple:
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.
Donc, valueForKey:
permettra de ne prendre que de la chaîne de valeur et est un KVC méthode. Alors qu' objectForKey:
vont prendre n'importe quel type d'objet.
REMARQUE: La valeur en objectForKey
seront accessibles par le même type d'objet.
L'espoir qui ajoute un autre aperçu de réponse à la question précédente.
Harry