2009-11-11 7 views
9

tengo este código:¡Qué hace! significa en Objective-C

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

donde _sessionKey se define anteriormente como:

NSString* _sessionKey; 

el código viene del facebook-Connect para iPhone.

Desde que estoy aprendiendo Objective-C mirando códigos escritos por otras personas. El !! utilizado en la función isConnection me parece inútil, ¿o me falta algo? ¿Qué hace?

+0

negando el valor booleano de la expresión dos veces. Mal estilo de codificación para la legibilidad. No muy explícito. Los programadores C hacen cosas como esta mucho. – uchuugaka

Respuesta

17

El !! convierte el resultado a cualquiera YES o NO.

Usando !!x es un lenguaje de C. El resultado de esta expresión es:

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

Al menos en C, puede utilizar cualquier no -expresión cero como un valor que satisface la condición de un if() u otro flujo de control condicional. Sin embargo, a veces es bueno saber que el "verdadero valor" está representado por 1 en lugar de simplemente "distinto de cero".

En Objective-C, YES se define como 1 en lugar de como "no cero". Por lo tanto, en Objective-C, este idioma C se vuelve más útil.

Otra manera de decirlo:

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

En este caso, dado que _sessionKey parece ser un objeto, 0 es equivalente a 'nil'. Y, dado que es Objective-C, el resultado es SÍ o NO, en lugar de 0 o 1. Lo siento si solo estoy sacando el excremento de la pimienta aquí. –

+0

Absolutamente, lo agregué. Benjamin, fíjate que es una wiki comunitaria. Siéntase libre de agregarlo. –

+4

Lo que nadie parece haber indicado explícitamente hasta ahora: '!!' no es, en sí mismo, un operador. Es solo el operador '!' Aplicado dos veces. – Nefrubyr

14

Significa "no no".

En este caso, ¡el primero! podría interpretarse como "no existe", por lo que significa si (no no existe sessionKey).

Se trata básicamente de una manera corta de decir

return (_sessionKey != nil).