NSDictionary - Besoin de vérifier si le dictionnaire contient ou non une paire clé-valeur

96

J'ai juste besoin de demander quelque chose comme suit. Supposons que j'aie un dictionnaire.

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
[xyz setValue:@"sagar" forKey:@"s"];
[xyz setValue:@"amit" forKey:@"a"];
[xyz setValue:@"nirav" forKey:@"n"];
[xyz setValue:@"abhishek" forKey:@"a"];
[xyz setValue:@"xrox" forKey:@"x"];

Maintenant, je dois vérifier comme suit

[xyz contient la valeur de la clé "b" ?? paire ou pas?

La question est comment?

L'autre question est de savoir comment simplement compter la paire clé-valeur totale?

Dites par exemple NSInteger mCount=[xyz keyCounts];

Sagar R. Kothari
la source

Réponses:

193

Demandez-lui simplement le objectForKey:@"b". S'il revient nil, aucun objet n'est défini sur cette clé.

if ([xyz objectForKey:@"b"]) {
    NSLog(@"There's an object set for key @\"b\"!");
} else {
    NSLog(@"No object set for key @\"b\"");
}

Edit : Quant à votre deuxième question éditée, c'est simplement NSUInteger mCount = [xyz count];. Ces deux réponses sont bien documentées et facilement trouvées dans la référence de classe NSDictionary ( [1] [2] ).

Matt B.
la source
+1 En fait, la documentation dit directement ceci: developer.apple.com/mac/library/documentation/Cocoa/Reference/…
Dave DeLong
6
Que faire si la clé est présente dans le dictionnaire et que sa valeur est 0? Ne penserions-nous pas à tort que la clé n'est pas du tout présente dans le dictionnaire?
jbx72487
13
@ jbx72487 Les dictionnaires doivent contenir des objets; objectForKey:renvoie un id- un pointeur vers un objet Objective-C. Si vous stockez des numéros, ils doivent être «encadrés» dans un NSNumber . Même si le NSNumber est zéro ou faux, il sera toujours un pointeur valide et le code ci-dessus détectera avec précision l'existence.
Matt B.
ne fonctionne pas avec moi, il renvoie ce qui suit: Arrêt de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '- [__ NSSingleObjectArrayI objectForKey:]: sélecteur non reconnu envoyé à l'instance 0x60000133a1c0'
Amr Angry
2

Avec la syntaxe littérale, vous pouvez vérifier comme suit

static const NSString* kKeyToCheck = @"yourKey"
if (xyz[kKeyToCheck])
  NSLog(@"Key: %@, has Value: %@", kKeyToCheck, xyz[kKeyToCheck]);
else
 NSLog(@"Key pair do not exits for key: %@", kKeyToCheck); 
Hariszaman
la source