在 UserDefaults 中存储 Int64

Storing Int64 in UserDefaults

我这样定义我的字典:

var teamsData = Dictionary<String,Dictionary<String,Int64>>()

然后,我尝试将其存储在 userdefaults 中:

NSUserDefaults.standardUserDefaults().setObject(teamsData, forKey: "teamsData")

但它抛出错误:

Type Dictionary<String,Dictionary<String,Int64>> does not conform to protocol 'Any Object'

用户默认对象只能是一个实例(或组合 实例)的 NSDataNSStringNSNumberNSDateNSArrayNSDictionary

一些 Swift 类型自动桥接到基础类型, 例如IntUIntFloatDoubleBool 桥接 至 NSNumber。所以这可以保存在用户默认值中:

var teamsData = Dictionary<String,Dictionary<String,Int>>()

在 64 位架构上,Int一个 64 位整数,但在 32位架构,Int是一个32位整数。

Int64等固定大小的整数类型不是 自动桥接到 NSNumber。这也被观察到 在 Swift - Cast Int64 to AnyObject for NSMutableArray。 因此,要在用户默认值中存储 64 位整数,您必须 明确使用 NSNumber

var teamsData = Dictionary<String,Dictionary<String,NSNumber>>()

// Example how to add a 64-bit value:
let value : UInt64 = 123
teamsData["foo"] = ["bar" : NSNumber(unsignedLongLong: value)]

Martin 对 Swift 3 的回答不再正确,因为 set 函数现在输入的是 Any? 而不是 AnyObject?.

您可以像这样在 UserDefaults 中存储 Int64:

import Foundation
let value: Int64 = 1000000000000000
UserDefaults.standard.set(value, forKey: "key")
if let value2 = UserDefaults.standard.object(forKey: "key") as? Int64 {
    // value2 is an Int64 with a value of 1000000000000000
    print(value2)
}

您可以将以上代码粘贴到 Swift playground 中并自己尝试。

Swift 4:

您可以在 UserDefaults 中将 int64 保存为字符串

let value: Int64 = 1000000000000000
let stringValue = String(value)
UserDefaults.standard.set(stringValue, forKey: "int64String")

这样你就避免了 Int 截断。

然后就可以恢复原来的值了:

let int64String = UserDefaults.standard.string(forKey: "int64String")
let originalValue = Int64(int64String!)

这允许您将它与其他 int64 值进行比较