Converti NSNumber in int in Objective-C


122

Uso [NSNumber numberWithInt:42]o @(42)per convertire un int in NSNumber prima di aggiungerlo a un NSDictionary:

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

Quando recupero il valore da NSDictionary, come posso trasformarlo da NSNumber a int?

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

Genera un'eccezione che dice che il casting è richiesto quando lo faccio in questo modo:

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

Risposte:


192

Dai un'occhiata alla documentazione . Usa il intValuemetodo:

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

La conversione implicita ora non è consentita con ARC.
Alexander

fondamentalmente [key intValue](la chiave è NSNumber)
user924

61

Dovresti attenersi ai NSIntegertipi di dati quando possibile. Quindi creeresti il ​​numero in questo modo:

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

La decodifica funziona con il integerValuemetodo quindi:

NSInteger value = [number integerValue];

Perché dovrebbe attenersi al NSInteger?
Iulian Onofrei

1
intè anche primitivo, sì. Tuttavia, il numero massimo consentito è definito in modo meno preciso. NSIntegerè essenzialmente solo un alias di un tipo intero primitivo noto per essere a 32 bit su macchine a 32 bit e 64 bit su dispositivi a 64 bit.
Max Seelemann

1
Sì, Apple suggerisce di farlo.
Max Seelemann

1
Consiglierei di non stimare nulla sull'aritmetica dei numeri nativi. Puoi sicuramente usarlo int, ma non ha molto senso farlo, ad eccezione dell'interfacciamento con librerie multipiattaforma. E anche in questo caso uint32_tsarebbe meglio usare qualcosa di simile .
Max Seelemann

1
In questo modo sarebbe sicuramente più coerente con gli standard di codifica della piattaforma, sì.
Max Seelemann



0

Un one-liner testato:

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.