Convierta NSNumber a int en Objective-C

122

Uso [NSNumber numberWithInt:42]o @(42)para convertir un int a NSNumber antes de agregarlo a un NSDictionary:

int intValue = 42;
NSNumber *numberValue = [NSNumber numberWithInt:intValue];
NSDictionary *dict = @{ @"integer" : numberValue };

Cuando recupero el valor de NSDictionary, ¿cómo puedo transformarlo de NSNumber de nuevo a int?

NSNumber *number = dict[@"integer"];
int *intNumber = // ...?

Lanza una excepción que dice que se requiere conversión cuando lo hago de esta manera:

int number = (int)dict[@"integer"];
suse
fuente

Respuestas:

192

Echa un vistazo a la documentación . Usa el intValuemétodo:

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];
Felix Kling
fuente
La conversión implícita ahora no está permitida con ARC.
Alexander
básicamente [key intValue](la clave es NSNumber)
usuario924
61

Debe atenerse a los NSIntegertipos de datos cuando sea posible. Entonces crearías el número así:

NSInteger myValue = 1;
NSNumber *number = [NSNumber numberWithInteger: myValue];

La decodificación funciona con el integerValuemétodo entonces:

NSInteger value = [number integerValue];
Max Seelemann
fuente
¿Por qué debería apegarse a la NSInteger?
Iulian Onofrei
1
intTambién es primitivo, sí. Sin embargo, su número máximo permitido se define con menos precisión. NSIntegeres esencialmente un alias de algún tipo entero primitivo que se sabe que es de 32 bits en máquinas de 32 bits y 64 bits en dispositivos de 64 bits.
Max Seelemann
1
Sí, Apple sugiere.
Max Seelemann el
1
Recomiendo no adivinar nada sobre aritmética de números nativos. Puede usarlo con seguridad int, pero no tiene mucho sentido hacerlo, excepto para interactuar con libs multiplataforma. E incluso entonces, algo así uint32_tsería mejor usar.
Max Seelemann el
1
Hacer eso ciertamente lo haría más consistente con los estándares de codificación de plataforma, sí.
Max Seelemann
1

Un enfoque menos detallado:

int number = [dict[@"integer"] intValue];
baskInEminence
fuente
0

Una línea probada:

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
Giorgio Barchiesi
fuente