如何将NSNumber转换/转换为Int64?

时间:2016-04-23 20:39:16

标签: swift

就像标题所说的那样。我必须将Int64存储在NSUserDefaults中,我发现这样做的唯一方法是将其存储为NSNumber,如

NSNumber(longLong: someInt64)

但我不知道如何将其转换回Int64。

2 个答案:

答案 0 :(得分:18)

<强> TL; DR

使用int64Value的{​​{1}}属性检索NSNumber值:

Int64

长答案

let someInt64: Int64 = 314 let n = NSNumber(value: someInt64) let m = n.int64Value // m is an `Int64` 与基本类型不同,例如NSNumberIntDouble是来自 Foundation ,它是围绕Objective-C及其限制而设计的。 NSNumber用作原始类型(例如NSNumberIntDouble)的对象包装器,它们不是对象。

在Objective-C中,对象存储在BoolNSArray中,但这些对象只能保存对象(即类的实例)。 NSDictionaryIntDouble等原始类型不是对象。 Objective-C的设计者有一个问题;如果你不能在数组和字典中放置整数或双精度,那么它将不会非常有用。解决方案是将这些原始类型包装在名为Bool的类中。

最初在Objective-C中,NSNumber是使用构造函数创建的,例如:

NSNumbers

当添加现代Objective-C 功能时,可以更简单地创建它们:

// Objective-C
NSNumber *n = [NSNumber numberWithDouble: 3.14];
NSNumber *b = [NSNumber numberWithBool: YES];

获得// Modern Objective-C NSNumber *n = @3.14; NSNumber *b = @YES; 后,您可以通过调用相应的属性来提取包含的值:

NSNumber

当将基本类型(// Objective-C double d = [n doubleValue]; // method call notation double d = n.doubleValue; // dot notation // Swift let d = n.doubleValue NSNumberInt等)分配给类型为{的变量时,Swift可以动态创建Double {1}}。这样做是为了方便从Swift调用BoolNSNumber API,而无需显式地包装原始类型(这本来很痛苦)。

Cocoa

关于Cocoa Touch的奇怪之处在于你可以放入一种类型并检索另一种类型:

// 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))

所以由程序来跟踪那里的内容。

因此,如果您有NSNumber并希望其中包含的值为// In Swift let n: NSNumber = 3.14 let truth = n.boolValue print(truth) // "true" ,则需要使用NSNumber属性访问它:

Int64

答案 1 :(得分:1)

SWIFT 3

存储和检索属性的示例,以毫秒为单位。可用于任何Int64对象:

 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)
        }
    }