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"];

Respuestas:


192

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

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];

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];

¿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



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.