Comment vérifier si un NSDictionary ou NSMutableDictionary contient une clé?
-
03-10-2019 - |
Question
Je dois vérifier si un dict a une clé ou non. Comment?
La solution
objectForKey
retourne zéro si une clé n'existe pas.
Autres conseils
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
ou
if ([dictionary objectForKey:key]) {
// contains object
}
Les versions les plus récentes de Objective-C et Clang ont une syntaxe moderne pour ceci:
if (myDictionary[myKey]) {
}
Vous n'avez pas à vérifier l'égalité avec nul, parce que les objets Objective-C ne non nul peuvent être stockés dans les dictionnaires (ou tableaux). Et tous les objets Objective-C sont des valeurs truthy. Même @NO
, @0
et [NSNull null]
évaluent comme vrai.
Edit: Swift est maintenant une chose.
Pour Swift vous essayer quelque chose comme ce qui suit
if let value = myDictionary[myKey] {
}
Cette syntaxe n'exécutera le bloc si si myKey est dans le dict et si elle est alors la valeur est stockée dans la variable de valeur. Notez que cela fonctionne pour les valeurs même de Falsey comme 0.
if ([mydict objectForKey:@"mykey"]) {
// key exists.
}
else
{
// ...
}
Lors de l'utilisation des dictionnaires JSON:
#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]
if( isNull( dict[@"my_key"] ) )
{
// do stuff
}
Je aime la réponse de Fernandes même si vous demandez l'obj deux fois.
Cela devrait également faire (plus ou moins le même que celui de A Martin).
id obj;
if ((obj=[dict objectForKey:@"blah"])) {
// use obj
} else {
// Do something else like creating the obj and add the kv pair to the dict
}
Martin et cette réponse à la fois le travail sur iPad2 iOS 5.0.1 9A405
Un Gotcha très méchant qui vient gaspillé un peu de mon temps de débogage -. Vous trouverez peut-être vous invité par autocomplétion essayer d'utiliser doesContain
qui semble fonctionner
A l'exception, doesContain
utilise une comparaison identifiant au lieu de la comparaison de hachage utilisée par objectForKey
donc si vous avez un dictionnaire avec les touches de chaîne, il retournera NON à un doesContain
.
NSMutableDictionary* keysByName = [[NSMutableDictionary alloc] init];
keysByName[@"fred"] = @1;
NSString* test = @"fred";
if ([keysByName objectForKey:test] != nil)
NSLog(@"\nit works for key lookups"); // OK
else
NSLog(@"\nsod it");
if (keysByName[test] != nil)
NSLog(@"\nit works for key lookups using indexed syntax"); // OK
else
NSLog(@"\nsod it");
if ([keysByName doesContain:@"fred"])
NSLog(@"\n doesContain works literally");
else
NSLog(@"\nsod it"); // this one fails because of id comparison used by doesContain
Utilisation de Swift, ce serait:
if myDic[KEY] != nil {
// key exists
}
Oui. Ce genre d'erreurs sont très fréquentes et conduire à l'accident de l'application. Donc, j'utilise pour ajouter NSDictionary dans chaque projet comme suit:
// code fichier h:.
@interface NSDictionary (AppDictionary)
- (id)objectForKeyNotNull : (id)key;
@end
//. Code fichier m est comme ci-dessous
#import "NSDictionary+WKDictionary.h"
@implementation NSDictionary (WKDictionary)
- (id)objectForKeyNotNull:(id)key {
id object = [self objectForKey:key];
if (object == [NSNull null])
return nil;
return object;
}
@end
Dans le code que vous pouvez utiliser comme ci-dessous:
NSStrting *testString = [dict objectForKeyNotNull:@"blah"];
Pour vérifier l'existence de la clé dans NSDictionary:
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
Parce que nul ne peut être stocké dans la Fondation des structures de données NSNull
est parfois représenter un nil
. Parce que NSNull
est un objet singleton vous pouvez vérifier pour voir si NSNull
est la valeur stockée dans le dictionnaire en utilisant la comparaison de pointeur direct:
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
Solution rapide 4.2
Donc, si vous voulez juste pour répondre à la question de savoir si le dictionnaire contient la clé, demandez:
let keyExists = dict[key] != nil
Si vous voulez la valeur et vous savez que le dictionnaire contient la clé, par exemple:
let val = dict[key]!
Mais si, comme cela arrive souvent, vous ne savez pas qu'il contient la clé - que vous voulez récupérer et l'utiliser, mais seulement si elle existe - alors utiliser quelque chose comme if let
:
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
Je vous suggère de stocker le résultat de la recherche dans une variable de température, test si la variable temp est nul et l'utiliser. De cette façon, vous ne regardez pas le même objet deux fois:
id obj = [dict objectForKey:@"blah"];
if (obj) {
// use obj
} else {
// Do something else
}
Comme suggéré Adirael objectForKey
pour vérifier l'existance clé, mais Lorsque vous appelez le dictionnaire objectForKey
in annulable, app se est écrasé si je fixe ceci de manière suivante.
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;
if (dictionary && (object != [NSNull null])) {
self.name = [dictionary objectForKey:@"name"];
self.age = [dictionary objectForKey:@"age"];
}
return self;
}
if ([MyDictionary objectForKey:MyKey]) {
// "Key Exist"
}