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

Respostas:


192

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

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

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

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



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.