我有以下测试代码:
func testSaveDictionary() {
let userDefaults = NSUserDefaults.standardUserDefaults()
var jo = [
"a" : "1.0",
"b" : "2.0"
]
let akey = "aKey"
userDefaults.setObject(jo, forKey: akey)
var isOk = userDefaults.synchronize()
var data0 = userDefaults.dictionaryForKey(akey)
println(data0)
}
println(data0)的输出为零。
我的代码有什么问题? Swift Dictionary是现在还是在最终版本中被认为是属性列表?
答案 0 :(得分:31)
更新 Swift 2,Xcode 7:正如@atxe注意到的,NSUserDefaults字典现在映射为[String, AnyObject]
。这是一个
Objective-C“轻量级通用”的结果允许
将Objective-C方法声明为
- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultName
(默认对象必须是属性列表,特别是字典 键只能是字符串。)
另一方面,如果可能的话,会自动桥接Swift词典,因此问题中的原始代码可以(再次)起作用:
let jo = [
"a" : "1.0",
"b" : "2.0"
]
let akey = "aKey"
// Swift 2:
userDefaults.setObject(jo, forKey: akey)
// Swift 3:
userDefaults.set(jo, forKey: akey)
Swift 1.2的原始答案:
用户默认值可以存储NSDictionary
个对象。这些映射到Swift
作为[NSObject : AnyObject]
:
var jo : [NSObject : AnyObject] = [
"a" : "1.0",
"b" : "2.0"
]
userDefaults.setObject(jo, forKey: akey)
var isOk = userDefaults.synchronize()
请注意dictionaryForKey()
返回一个可选项,因此您应该检查它
例如,使用可选的分配:
if let data0 = userDefaults.dictionaryForKey(akey) {
print(data0)
} else {
print("not set")
}
// Output: [b: 2.0, a: 1.0]
答案 1 :(得分:12)
您需要先将其转换为NSData
。像这样:
var data = NSKeyedArchiver.archivedDataWithRootObject(jo)
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(data, forKey:akey)
答案 2 :(得分:4)
昨天我遇到了这个问题并提出了雷达:Cannot store Dictionary in NSUserDefaults in iOS8。此问题仅与iOS 8有关。此外,我还介绍了此案例的解决方法:Workaround for saving dictionary in NSUserDefaults。像魅力一样。
/// Save
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(object), forKey: key)
/// Read
var data = NSUserDefaults.standardUserDefaults().objectForKey(key) as NSData
var object = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [String: String]
答案 3 :(得分:3)
请按照以下美丽代码 - &gt;斯威夫特3
public func setDict(dict: NSDictionary) {
let data = NSKeyedArchiver.archivedData(withRootObject: dict)
let userDefaults = UserDefaults.standard
userDefaults.set(data, forKey:"keyHere")
}
public func getDict() -> NSDictionary {
let data = UserDefaults.standard.object(forKey: "keyHere") as! NSData
let object = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as! NSDictionary
return object;
}
答案 4 :(得分:2)
// swift 4.0
//用于保存
let userDefaults = UserDefaults.standard
userDefaults.setValue(value, forKey: "Your_Key")
userDefaults.synchronize()
// for for retrieve
let loadedCart = UserDefaults.standard.dictionary(forKey: "Your_Key")