Converter NSNumber para int em Objective-C

122

Eu uso [NSNumber numberWithInt:42]ou @(42)para converter um int em NSNumber antes de adicioná-lo a um NSDictionary:

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

Quando recupero o valor do NSDictionary, como posso transformá-lo de NSNumber em int?

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

Emite uma exceção dizendo que a conversão é necessária quando eu faço dessa maneira:

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

Respostas:

192

Dê uma olhada na documentação . Use o intValuemétodo:

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];
Felix Kling
fonte
A conversão implícita agora não é permitida com o ARC.
Alexander Alexander
basicamente [key intValue](chave é NSNumber)
user924
61

Você deve manter os NSIntegertipos de dados quando possível. Então você criaria o número assim:

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

A decodificação funciona com o integerValuemétodo:

NSInteger value = [number integerValue];
Max Seelemann
fonte
Por que ele deveria se ater ao NSInteger?
Iulian Onofrei
1
inttambém é primitivo, sim. No entanto, seu número máximo permitido é definido com menos precisão. NSIntegeré essencialmente apenas um alias para algum tipo inteiro primitivo que é conhecido por ser de 32 bits em máquinas de 32 bits e 64 bits em dispositivos de 64 bits.
precisa saber é o seguinte
1
Sim, a Apple sugere.
precisa saber é o seguinte
1
Eu recomendaria não adivinhar nada sobre aritmética de números nativos. Você pode usar com certeza int, mas há pouco sentido em fazer isso, exceto a interface com bibliotecas de plataforma cruzada. E mesmo assim, algo como uint32_tseria melhor usar.
Max Seelemann
1
Fazer isso certamente tornaria mais consistente com os padrões de codificação de plataforma, sim.
Max Seelemann
1

Uma abordagem menos detalhada:

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

Uma linha testada:

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