Question

Je dois vérifier si un dict a une clé ou non. Comment?

Était-ce utile?

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 objectForKeyin 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"
} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top