2009-11-11 5 views
9

J'ai ce code:Que fait !! dire en Objective-C

- (BOOL)isConnected { 
    return !!_sessionKey; 
} 

où _sessionKey est défini précédemment comme:

NSString* _sessionKey; 

le code provient de la facebook-connect pour iPhone. Depuis que j'apprends l'objectif-C en regardant le code écrit par d'autres personnes. Le !! utilisé dans la fonction isConnection me semble inutile, ou ai-je oublié quelque chose? Qu'est ce que ça fait?

+0

Opposer la valeur booléenne de l'expression deux fois. Mauvais style de codage pour la lisibilité. Pas très explicite. Les programmeurs C font beaucoup de choses comme ça. – uchuugaka

Répondre

17

Le !! convertit le résultat soit YES ou NO.

En utilisant !!x est un idiome de C. Le résultat de cette expression est:

  • !!x == 0 quand x == 0 // x is zero
  • !!x == 1 lorsque x != 0 // x is non-zero

au moins en C, vous pouvez utiliser tout non -zero expression en tant que valeur qui satisfait la condition d'un if() ou d'un autre flux de contrôle conditionnel. Cependant, il est parfois bon de savoir que la "vraie valeur" est représentée par 1 plutôt que simplement "non nul".

En Objective-C, YES est défini comme 1 plutôt que comme "non nul". Ainsi, en Objective-C, cet idiome devient plus utile.

Une autre façon de le mettre:

  • !!x == NO quand x == NO
  • !!x == YES quand x != NO
+0

Dans ce cas, puisque _sessionKey semble être un objet, 0 est équivalent à 'nil'. Et, puisque c'est Objective-C, le résultat est OUI ou NON, plutôt que 0 ou 1. Désolé si je ne fais que ramasser la bouse de mouche du poivre ici. –

+0

Absolument, j'ai ajouté cela. Benjamin, notez que c'est un wiki communautaire. N'hésitez pas à y ajouter. –

+4

Ce que personne ne semble avoir explicitement indiqué jusqu'ici: «!!» n'est pas, en soi, un opérateur. C'est juste l'opérateur '!' Appliqué deux fois. – Nefrubyr

14

Cela signifie «pas non».

Dans ce cas, le premier! pourrait être interprété comme "n'existe pas", donc cela signifie si (n'existe pas) sessionKey).

Il est essentiellement un moyen à court de dire

return (_sessionKey != nil).