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"];
suse
la source

Réponses:

192

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

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];
Félix Kling
la source
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];
Max Seelemann
la source
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
1

Une approche moins verbeuse:

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

Un one-liner testé:

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