Swift NSUserDefaults没有保存字典?

时间:2014-09-09 19:45:24

标签: dictionary swift nsuserdefaults

我有以下测试代码:

  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是现在还是在最终版本中被认为是属性列表?

5 个答案:

答案 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")