Konvertieren Sie NSNumber in Objective-C in int

122

Ich verwende [NSNumber numberWithInt:42]oder @(42)konvertiere ein int in NSNumber, bevor ich es einem NSDictionary hinzufüge:

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

Wie kann ich den Wert von NSNumber zurück in int umwandeln, wenn ich ihn aus dem NSDictionary abrufe?

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

Es wird eine Ausnahme ausgelöst, die besagt, dass Casting erforderlich ist, wenn ich es so mache:

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

Antworten:

192

Schauen Sie sich die Dokumentation an . Verwenden Sie die intValueMethode:

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];
Felix Kling
quelle
Die implizite Konvertierung ist mit ARC jetzt nicht mehr zulässig.
Alexander
im Grunde [key intValue](Schlüssel ist NSNumber)
user924
61

Sie sollten sich nach NSIntegerMöglichkeit an die Datentypen halten. Sie würden also die Nummer folgendermaßen erstellen:

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

Die Dekodierung funktioniert dann mit der integerValueMethode:

NSInteger value = [number integerValue];
Max Seelemann
quelle
Warum sollte er sich an die halten NSInteger?
Iulian Onofrei
1
intist auch primitiv, ja. Die maximal zulässige Anzahl ist jedoch weniger genau definiert. NSIntegerist im Wesentlichen nur ein Alias ​​für einen primitiven Integer-Typ, der auf 32-Bit-Computern als 32-Bit und auf 64-Bit-Geräten als 64-Bit bekannt ist.
Max Seelemann
1
Ja, Apple schlägt vor.
Max Seelemann
1
Ich würde empfehlen, nichts über native Zahlenarithmetik zu erraten. Sie können sicher verwenden int, aber es macht wenig Sinn, dies zu tun, außer für die Schnittstelle mit plattformübergreifenden Bibliotheken. Und selbst dann uint32_twäre so etwas besser zu benutzen.
Max Seelemann
1
Dies würde es sicherlich konsistenter mit den Plattformcodierungsstandards machen, ja.
Max Seelemann
1

Ein weniger ausführlicher Ansatz:

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

Ein getesteter Einzeiler:

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