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\"!");
}
Me debe recordar para no utilizar% @ :) Gracias;) – patrick