2010-05-03 9 views
4

Existe-t-il un moyen de vérifier si une valeur est NULL/Nil avant de l'affecter à un BOOL?Comment vérifier si un BOOL est nul?

Par exemple, j'ai une valeur dans un NSDictionary qui peut être soit VRAI/FAUX/NULL

mySTUser.current_user_following = [[results objectForKey:@"current_user_following"]boolValue]; 

Lorsque la valeur est NULL, je reçois l'erreur suivante

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSNull boolValue]: unrecognized selector sent to instance 

Je voudrais être capable de gérer le cas NULL.

+4

Juste pour que vous êtes clair, en Obj-C les valeurs suivantes sont égales: 0, NO, NULL, nul. La valeur de retour de votre dictionnaire est un objet NSNull, pas NULL. C'est pourquoi @ChristopheD compare avec [NSNull null] ', et non avec NULL. – kubi

Répondre

10

Vous devez check for[NSNull null]:

id vUser = [results objectForKey:@"current_user_following"]; 

if (vUser != [NSNull null]) { 
    // do stuff... 
} 
else { 
    // handle the case appropriately... 
} 
+0

Pourquoi appeler 'objectForKey:' deux fois pour la même clé? –

+0

@gf: bon point, mise à jour de mon message un peu ;-) – ChristopheD

+3

Vous devriez également vérifier que rien n'est renvoyé, c'est-à-dire qu'aucune entrée pour la clé n'existe dans le dictionnaire. – JeremyP

5

Vous pouvez tester d'abord et affecter puis conditionnellement, par ex. quelque chose comme ce qui suit:

if (NSValue* val = [results objectForKey:@"current_user_following"]) { 
    mySTUser.current_user_following = [val boolValue]; 
} 

Ce:

  • évite d'appeler objectForKey: deux fois en stockant le résultat dans une variable
  • limite la portée de la variable à la déclaration if
  • fonctionne parce que nil est équivalent à 0
  • exécute donc uniquement l'instruction d'affectation si val n'est pas nil

Pour vérifier en plus la valeur étant NSNull que vous auriez à ajouter un autre test donné par ChristopheD, mais je doute wether NSNull est vraiment nécessaire ici - YES/NO devrait être suffisant pour une description comme " suit ".
Si vous n'avez aucune valeur utile pour une touche, vous pouvez simplement la supprimer du dictionnaire ou ne pas l'insérer en premier lieu.

+0

vouliez-vous dire [val boolValue] plutôt que [obj boolValue]? – progrmr

+0

@ kk6yb: Oups, merci. –

+1

Cela ne fonctionne pas pour moi .. (développement pour 10,6 cibles avec ARC). Je reçois ERREURS de compilateur indiquant 'Nom d'interface inattendue 'NSValue': expression attendue'. Je pourrais enlever l'assignation de la NSValue dans le contrôle pour le néant .. mais ce serait sorte de vaincre le but, détruire la brièveté de cette solution. –

Questions connexes