我像这样定义我的字典:
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'
答案 0 :(得分:18)
用户默认对象只能是实例(或其组合)
实例)
NSData
,NSString
,NSNumber
,NSDate
,NSArray
或NSDictionary
。
某些Swift类型会自动桥接到Foundation类型,
例如Int
,UInt
,Float
,Double
和Bool
被桥接
到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值进行比较