Convertir NSNumber en int dans Objective-C


122

J'utilise [NSNumber numberWithInt:42]ou @(42)pour convertir un int en NSNumber avant de l'ajouter à un NSDictionary:

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

Lorsque je récupère la valeur du NSDictionary, comment puis-je la transformer de NSNumber en int?

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

Il lève une exception indiquant que le casting est requis lorsque je le fais de cette façon:

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

Réponses:


192

Jetez un œil à la documentation . Utilisez la intValueméthode:

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

La conversion implicite est désormais interdite avec ARC.
Alexander

fondamentalement [key intValue](la clé est NSNumber)
user924

61

Vous devez vous en tenir aux NSIntegertypes de données lorsque cela est possible. Donc, vous créez le numéro comme ça:

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

Le décodage fonctionne avec la integerValueméthode alors:

NSInteger value = [number integerValue];

Pourquoi devrait-il s'en tenir à la NSInteger?
Iulian Onofrei

1
intest primitif aussi, oui. Cependant, son nombre maximum autorisé est défini avec moins de précision. NSIntegerest essentiellement juste un alias d'un type entier primitif connu pour être 32 bits sur les machines 32 bits et 64 bits sur les périphériques 64 bits.
Max Seelemann

1
Oui, Apple le suggère.
Max Seelemann

1
Je recommanderais de ne rien supposer sur l'arithmétique des nombres natifs. Vous pouvez certainement l'utiliser int, mais cela ne sert à rien, sauf pour l'interfaçage avec des bibliothèques multiplateformes. Et même dans ce cas, il uint32_tserait préférable d'utiliser quelque chose comme .
Max Seelemann

1
Cela le rendrait certainement plus conforme aux normes de codage de la plate-forme, oui.
Max Seelemann



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.