就像标题所说的那样。我必须将Int64
存储在NSUserDefaults
中,我发现这样做的唯一方法是将其存储为NSNumber
,如
NSNumber(longLong: someInt64)
但我不知道如何将其转换回Int64。
答案 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`
与基本类型不同,例如NSNumber
和Int
。 Double
是来自 Foundation 的类,它是围绕Objective-C及其限制而设计的。 NSNumber
用作原始类型(例如NSNumber
,Int
和Double
)的对象包装器,它们不是对象。
在Objective-C中,对象存储在Bool
和NSArray
中,但这些对象只能保存对象(即类的实例)。 NSDictionary
,Int
和Double
等原始类型不是对象。 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
,NSNumber
,Int
等)分配给类型为{的变量时,Swift可以动态创建Double
{1}}。这样做是为了方便从Swift调用Bool
和NSNumber
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)
}
}