2009-11-11 13 views
9

Ich habe diesen Code:Was macht !! bedeuten, in Objective-C

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

wo _sessionKey definiert ist früher als:

NSString* _sessionKey; 

der Code stammt aus dem Facebook-Connect für iphone.

Seit ich Objective-C lerne, indem ich den Code anderer Leute ansehe. Die !!, die in der isConnection Funktion verwendet wird, scheint mir nutzlos, oder fehlt mir etwas? Was tut es?

+0

den Booleschen Wert des zweimal Ausdruck negieren. Schlechter Codierungsstil für Lesbarkeit. Nicht sehr explizit. C-Programmierer machen solche Sachen oft. – uchuugaka

Antwort

17

Die !! wandelt das Ergebnis entweder YES oder NO zu sagen.

!!x Verwendung ist ein Idiom von C. Das Ergebnis dieses Ausdrucks ist:

  • !!x == 0 wenn x == 0 // x is zero
  • !!x == 1 wenn x != 0 // x is non-zero

Zumindest in C können Sie alle nicht benutzen - Null Ausdruck als ein Wert, der die Bedingung eines if() oder eines anderen bedingten Steuerflusses erfüllt. Manchmal ist es jedoch schön zu wissen, dass der "wahre Wert" durch 1 repräsentiert wird und nicht nur "nicht Null".

In Objective-C ist YES als 1 und nicht als "nicht Null" definiert. In Objective-C wird dieses C-Idiom also nützlicher.

Eine andere Art, es auszudrücken:

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

Da in diesem Fall _sessionKey ein Objekt zu sein scheint, ist 0 gleichbedeutend mit 'nil'. Und da es Objective-C ist, ist das Ergebnis JA oder NEIN, anstatt 0 oder 1. Tut mir leid, wenn ich hier nur den Mist aus dem Pfeffer picke. –

+0

Absolut, ich habe das hinzugefügt. Benjamin, beachte, dass es ein Community-Wiki ist. Fühlen Sie sich frei, es hinzuzufügen. –

+4

Was bisher noch nicht explizit erwähnt wurde: '!!' ist selbst kein Operator. Es ist nur der Operator '!', Der zweimal angewendet wurde. – Nefrubyr

14

Es bedeutet "nicht nicht".

In diesem Fall der erste! könnte interpretiert werden als "existiert nicht", also bedeutet es, wenn (nicht existiert sessionKey).

Es ist im Grunde ein kurzer Weg

return (_sessionKey != nil).