小编典典

Swift NSUserDefaults不保存字典?

swift

我有以下测试代码:

  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)的输出为nil。

我的代码有问题吗?Swift字典是现在还是最终版本中的属性列表?


阅读 324

收藏
2020-07-07

共1个答案

小编典典

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]
2020-07-07