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

Antworten:


192

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

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

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

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



0

Ein getesteter Einzeiler:

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.