在UserDefaults中存储Int64

时间:2015-01-27 18:25:57

标签: xcode swift dictionary nsuserdefaults

我像这样定义我的字典:

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'

3 个答案:

答案 0 :(得分:18)

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

某些Swift类型会自动桥接到Foundation类型, 例如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)]

答案 1 :(得分:15)

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游乐场并尝试自己。

答案 2 :(得分:1)

迅速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值进行比较