2016-04-23 27 views
7

Genau wie der Titel sagt. Ich hatte Int64 in NSUserDefaults zu speichern und der einzige Weg, fand ich, dass zu tun, war es, als NSNumber wieWie konvertiert man NSNumber in Int64?

NSNumber(longLong: someInt64) 

speichern, aber ich weiß nicht, wie es zu Int64 konvertieren zurück.

+4

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

+0

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

+0

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

Antwort

16

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` 
+0

Danke Mann, sie sollten Sie dazu bringen, die Dokumente zu schreiben. Die Sache ist jetzt, dass ich deine Erklärung gelesen habe, ich kann auch diesen Teil der offiziellen Dokumente verstehen. Was mich verwirrte und mich in diesem Fall abwarf war, dass ich 'Double (someNSNumber)' oder 'Int (someNSNumber)' aber nicht 'Int64 (someNSNumber)' machen konnte. – TimSim

+0

'longLongValue' wurde in 'int64Value' umbenannt –

+0

Danke @RadekWilczak! Ich habe die Antwort aktualisiert. – vacawama

1

SWIFT 3

Ein Beispiel für die Speicherung und Abrufen der Eigenschaften für Millisekunden. Kann für jede Int64 Objekt verwendet werden:

fileprivate static let TIME = "TIME" 
public static var time: Int64 { 
     get { 
      if let obj = UserDefaults.standard.object(forKey: TIME), let t = obj as? NSNumber { 
       return t.int64Value 
      } 
       return Int64(Date().timeIntervalSince1970 * 1000.0) 
     } 
     set(v) { 
      UserDefaults.standard.set(NSNumber(value: v), forKey: TIME) 
     } 
    } 
Verwandte Themen