就像标题所说的那样.我不得不存储Int64在NSUserDefaults,我发现这样做的唯一方法是将其存储为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不像原始类型,如Int和Double. NSNumber是一个来自Foundation的类,它是围绕Objective-C及其局限性设计的. 用作原始类型的对象的包装(如,,和),其不是对象.NSNumberIntDoubleBool
在Objective-C中,对象存储在NSArray和中NSDictionary,但是这些对象只能保存对象(即类的实例).基本类型,如Int,Double和Bool不是对象.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 调用Cocoa和Cocoa 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)
| 归档时间: |
|
| 查看次数: |
10238 次 |
| 最近记录: |