Question Comment vérifier si un NSDictionary ou NSMutableDictionary contient une clé?


J'ai besoin de vérifier si un dict a une clé ou non. Comment?


438
2018-05-06 21:27


origine


Réponses:


objectForKey retournera nul si une clé n'existe pas.


742
2018-05-06 21:30



if ([[dictionary allKeys] containsObject:key]) {
    // contains key
}

ou

if ([dictionary objectForKey:key]) {
    // contains object
}

160
2018-05-06 21:31



Les versions plus récentes d'Objective-C et de Clang ont une syntaxe moderne pour cela:

if (myDictionary[myKey]) {

}

Vous n'avez pas besoin de vérifier l'égalité avec nil, car seuls les objets Objective-C non nuls peuvent être stockés dans des dictionnaires (ou des tableaux). Et tous les objets Objective-C sont des valeurs véridiques. Même @NO, @0, et [NSNull null] évaluer comme vrai.

Edit: Swift est maintenant une chose.

Pour Swift, vous essayez quelque chose comme ce qui suit

if let value = myDictionary[myKey] {

}

Cette syntaxe n'exécutera le bloc if que si myKey est dans le dict et si c'est le cas, la valeur est stockée dans la variable value. Notez que cela fonctionne même pour des valeurs Falsey comme 0.


94
2018-02-25 00:09



if ([mydict objectForKey:@"mykey"]) {
    // key exists.
}
else
{
    // ...
}

20
2018-05-06 21:30



Lors de l'utilisation de dictionnaires JSON:

#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]

if( isNull( dict[@"my_key"] ) )
{
    // do stuff
}

9
2017-07-24 14:40



J'aime la réponse de Fernandes même si vous demandez deux fois l'obj.

Cela devrait également faire (plus ou moins le même que celui de 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's et cette réponse travaillent tous deux sur iPad2 iOS 5.0.1 9A405


8
2018-02-06 20:07



Un très méchant gotcha qui a juste perdu un peu de temps à me déboguer - vous pouvez vous retrouver obligé de compléter automatiquement pour essayer d'utiliser doesContain qui semble fonctionner.

Sauf, doesContain utilise une comparaison d'ID au lieu de la comparaison de hachage utilisée par objectForKey donc si vous avez un dictionnaire avec des clés de chaîne, il renverra NO à 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

5
2017-11-10 20:11



En utilisant Swift, ce serait:

if myDic[KEY] != nil {
    // key exists
}

4
2017-10-28 07:33