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

Tim*_*Sim 10 swift

就像标题所说的那样.我不得不存储Int64NSUserDefaults,我发现这样做的唯一方法是将其存储为NSNumber

NSNumber(longLong: someInt64)
Run Code Online (Sandbox Code Playgroud)

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

vac*_*ama 21

TL; DR

使用int64Value属性NSNumber来检索Int64值:

let someInt64: Int64 = 314

let n = NSNumber(value: someInt64)

let m = n.int64Value  // m is an `Int64`
Run Code Online (Sandbox Code Playgroud)

答案很长

NSNumber不像原始类型,如IntDouble. NSNumber是一个来自Foundation,它是围绕Objective-C及其局限性设计的. 用作原始类型的对象的包装(如,,和),其不是对象.NSNumberIntDoubleBool

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

最初在Objective-C中,NSNumbers使用以下构造函数创建:

// Objective-C
NSNumber *n = [NSNumber numberWithDouble: 3.14];
NSNumber *b = [NSNumber numberWithBool: YES];
Run Code Online (Sandbox Code Playgroud)

现代的Objective-C中新增的功能,就有可能更简单地创建它们:

// Modern Objective-C
NSNumber *n = @3.14;
NSNumber *b = @YES;
Run Code Online (Sandbox Code Playgroud)

有了之后NSNumber,您可以通过调用相应的属性来提取包含的值:

// Objective-C
double d = [n doubleValue];     // method call notation
double d = n.doubleValue;       // dot notation

// Swift
let d = n.doubleValue
Run Code Online (Sandbox Code Playgroud)

SWIFT已创建的能力NSNumber指定为基本型(当在飞行Int,Double,Bool等),以类型的变量NSNumber.这样做是为了方便从Swift 调用CocoaCocoa TouchAPI而不必显式地包装原始类型(这将是痛苦的).

// 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))
Run Code Online (Sandbox Code Playgroud)

奇怪的NSNumber是你可以放入一种类型并检索另一种类型:

// In Swift
let n: NSNumber = 3.14
let truth = n.boolValue
print(truth)   // "true"
Run Code Online (Sandbox Code Playgroud)

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

因此,如果您有一个NSNumber并希望包含在其中的值Int64,则需要使用该int64Value属性访问它:

let n = NSNumber(value: someInt64)
let m = n.int64Value  // m is an `Int64`
Run Code Online (Sandbox Code Playgroud)