TL; DR
Verwenden Sie die int64Value
Eigenschaft NSNumber
den Int64
Wert abzurufen:
let someInt64: Int64 = 314
let n = NSNumber(value: someInt64)
let m = n.int64Value // m is an `Int64`
Lange Antwort
NSNumber
ist anders als primitive Typen, als Int
und Double
. NSNumber
ist eine Klasse, die von Foundation kommt, die um Objective-C und seine Einschränkungen entwickelt wurde. NSNumber
dient als Objektwrapper für primitive Typen (z. B. Int
, Double
und Bool
), die keine Objekte sind.
In Objective-C werden Objekte in NSArray
und NSDictionary
gespeichert, aber diese können nur Objekte enthalten (d. H. Instanzen von Klassen). Primitive Typen wie Int
, Double
und Bool
sind keine Objekte. Die Designer von Objective-C hatten ein Problem; es wäre nicht sehr nützlich, wenn Sie ganze Zahlen oder Doppel in Arrays und Wörterbücher nicht einfügen könnten. Die Lösung bestand darin, diese primitiven Typen in eine Klasse namens NSNumber
einzubinden.
Ursprünglich in Objective-C wurden NSNumbers
mit Konstrukteuren erstellt wie:
// Objective-C
NSNumber *n = [NSNumber numberWithDouble: 3.14];
NSNumber *b = [NSNumber numberWithBool: YES];
Wenn Moderne Objective-C Features hinzugefügt wurden, wurde es möglich, sie einfacher zu erstellen:
// Modern Objective-C
NSNumber *n = @3.14;
NSNumber *b = @YES;
Sobald Sie eine NSNumber
haben, können Sie den enthaltenen Wert extrahieren, indem Sie die entsprechende Eigenschaft aufrufen:
Swift hat die Fähigkeit NSNumber
im Fluge zu schaffen, wenn ein primitiven Typs Zuweisen (Int
, Double
, Bool
, etc.) zu einer Variablen des Typs NSNumber
. Dies wurde gemacht, um es einfach zu machen, Cocoa
und APIs von Swift aufzurufen, ohne primitive Typen explizit umbrechen zu müssen (was schmerzhaft gewesen wäre).
// In Swift
let n: NSNumber = 3.14 // No need to do let n = NSNumber(double: 3.14)
let a = NSMutableArray()
a.addObject(3.14) // No need for a.addObject(NSNumber(double: 3.14))
a.addObject(true) // No need for a.addObject(NSNumber(bool: true))
Die seltsame Sache über NSNumber
ist, dass Sie in einer Art und abrufen einer anderen setzen können:
// In Swift
let n: NSNumber = 3.14
let truth = n.boolValue
print(truth) // "true"
so ist es, um das Programm auf, um zu verfolgen, was da drin ist.
Also, wenn Sie ein NSNumber
haben und wollen den innerhalb als Int64
enthaltenen Wert, müssen Sie es mit der int64Value
Eigenschaft zuzugreifen:
let n = NSNumber(value: someInt64)
let m = n.int64Value // m is an `Int64`
Ein wenig [Lesen der Dokumentation] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/ # // apple_ref/occ/instp/NSNumber/longLongValue) kann einen langen Weg zurücklegen. – nhgrif
Ich schaute auf diese Seite und entweder habe ich nicht gesehen oder ich habe das nicht verstanden. In der Tat bin ich mir nicht sicher, ob ich es jetzt verstehe. Okay, ich bin dumm, du bist schlau, bist du glücklich? – TimSim
Welchen Teil verstehst du nicht? Das Lesen von Dokumentationen ist ein entscheidender Teil des Entwickelns. Wenn Sie also etwas nicht verstehen, würde ich Ihnen gerne helfen, es herauszufinden (was Ihnen auf lange Sicht sicher sein wird, dass Sie Zeit sparen werden). – nhgrif