2010-10-17 20 views
15

Tengo una pregunta simple (creo): Estoy tratando de comparar una NSNumber con un int, para ver si es 0 o 1. Aquí está el código:un NSNumber a un int

id i = [dictionary objectForKey:@"error"]; //class = NSCFNumber 

NSLog(@"%@ == 0 -> %@", i, i == 0); 
NSLog(@"%@ == 0 -> %@", i, [i compare:[NSNumber numberWithBool:NO]]); 

he intentado esto con los métodos pero me da como resultado nulo:

2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null) 
2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null) 

¿me puede ayudar?

Respuesta

40
  1. El resultado de la comparación es un BOOL que no es un objeto Objective-C. Por lo tanto, debe no imprimirlo usando %@. Pruebe %d en su lugar (muestra 0 o 1).

  2. [a compare:b] devuelve -1 si a < b, 0 si a == b y 1 si a > b. Por lo tanto, se espera su segundo resultado.

  3. No se puede comparar un NSNumber directamente con un número entero. Esa i == 0 es realmente una puntero comparación que comprueba si i es NULO (0), que por supuesto es FALSO si ese número existe. Por lo tanto, también se espera el primer resultado.

  4. Si quiere comprobar la igualdad, use [a isEqualToNumber:b]. Alternativamente, puede extraer el número entero con [a intValue] y comparar con otro entero directamente.

Así que lo siguiente debería funcionar:

NSLog(@"%@ == 0 -> %d", i, [i isEqualToNumber:[NSNumber numberWithInt:0]]); 
NSLog(@"%@ == 0 -> %d", i, [i intValue] == 0); 

Si el "número" es en realidad un valor lógico, es mejor tomar el lugar -boolValue.

NSLog(@"%@ == 0 -> %d", i, ! [i boolValue]); 
+0

Me debe recordar para no utilizar% @ :) Gracias;) – patrick

9

Aquí está comparando el puntero del objeto i con 0, lo cual me temo que no es lo que quiere.

Lo más probable desea comparar el valor de i:

if ([i intValue]==0) { 
    ... 
} 
3

fácilmente puede escribir:

NSNumber *number = [NSNumber numberWithInt:123]; 
int integer = 1234; 

NSLog(@"%@ == %i : %i", number, integer, [number intValue] == integer); 

de salida debe ser

123 == 1234 : 0 


espero poder ¡ayudarte!

3

usted tiene dos problemas:

  • Usted está confundiendo el objeto NSNumber con el valor que representa.
  • Su cadena de formato NSLog no coincide con los tipos de argumentos que proporciona.

En cuanto al primer problema: i es una dirección, tal vez algo así como 0x1f84b. Cuando prueba si i == 0, está probando si i == NULL. En este caso, eso significa que está probando si el "error" de la clave estaba presente en el diccionario o no, ya que al buscar una clave que no existe obtiene un NULL.

[i intValue], por otro lado, es un número entero. Si el NSNumber contiene un valor representable como un entero, este será el valor de NSNumber. Eso es lo que verá cuando imprima la descripción de NSNumber utilizando el especificador de formato %@.

En cuanto al segundo problema: las comparaciones en C y Objective-C devuelven un entero, ya sea 0 (que significa falso) o 1 (que significa verdadero). Para imprimir directamente el resultado de una comparación, necesita usar el especificador de formato entero. En realidad, existen dos de estos especificadores, %i y %d. Puede envolver el resultado de la comparación en un NSNumber y usar %@ para imprimir eso, pero eso es más trabajo de lo que vale.

Por lo tanto, esto es lo que debe hacer:

NSNumber *i = [dictionary objectForKey:@"error"]; 
BOOL haveValue = (i != NULL); 
if (haveValue) { 
    int iValue = [i intValue]; 
    NSLog(@"%d == 0 -> %d", iValue, iValue == 0); 
    NSLog(@"%@ compared to 0 -> %d", i, [i compare:[NSNumber numberWithInt:0]]); 
} else { 
    NSLog(@"*** Dictionary has no value for key \"error\"!"); 
} 
0

Esto funcionó

if (thevariable.intValue==0) { 
    ... 
}