Swift NSUserDefaults没有保存字典?

Sea*_*ean 23 dictionary 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)

  }
Run Code Online (Sandbox Code Playgroud)

println(data0)的输出为零.

我的代码有什么问题吗?Swift Dictionary是现在还是在最终版本中被认为是属性列表?

Mar*_*n R 31

更新Swift 2,Xcode 7:正如@atxe注意到的那样,NSUserDefaults词典现在被映射为[String, AnyObject].这是Objective-C"轻量级泛型"的结果,它允许将Objective-C方法声明为

- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultName
Run Code Online (Sandbox Code Playgroud)

(默认对象必须是属性列表,特别是字典键只能是字符串.)

另一方面,如果可能的话,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)
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

请注意,dictionaryForKey()返回一个可选项,因此您应该检查它,例如使用可选的赋值:

if let data0 = userDefaults.dictionaryForKey(akey) {
    print(data0)
} else {
    print("not set")
}

// Output: [b: 2.0, a: 1.0]
Run Code Online (Sandbox Code Playgroud)

  • 对吧!关键是显式声明:var jo:[NSObject:AnyObject]如上所述. (2认同)

Ant*_*ong 12

您需要将其转换为NSData第一个.像这样的东西:

var data = NSKeyedArchiver.archivedDataWithRootObject(jo)
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(data, forKey:akey) 
Run Code Online (Sandbox Code Playgroud)