Swift - 将字典保存到 NSUserDefaults 时 macOS 程序卡住

Swift - macOS Program Stuck when Saving Dictionary to NSUserDefaults

我一直在尝试将类型为 [Int:String] 的字典保存到 NSUserDefaults 中,它曾经运行良好,但最近就不行了。 macOS 程序在调用保存方法时卡住(使用 rainbow 加载程序)并且永远不会恢复。

因为我之前能够做到这一点,我怀疑这可能与 NSUserDefaults 在我的 mac 上的存储位置有关(我不知道那是什么)。

这是我的代码:

    let defaults = NSUserDefaults.standardUserDefaults()
    var dict: [Int: String] = [:]
    dict[1] = "123512"
    dict[2] = "1231232"
    dict[3] = "112512"
    dict[4] = "1212081"
    print(dict)
    defaults.setObject(dict, forKey: "cameraOrder")

目前,objectForKey: "cameraOrder" 是空的,这是我通过在终端上调用 "defaults delete [Bundle ID]" 来完成的。

在此先感谢您的帮助。

附加信息

我认为这个问题可能与保存字典类型有关。如果我 运行 这个代码:

    defaults.setObject("12", forKey: "cameraOrder")
    print(defaults.objectForKey("cameraOrder"))

完美运行。

令人惊讶的是,即使我保存了 [String:String] 类型的字典,它也能正常工作(将键 1 更改为“1”)

尝试从 NSUserDefaults 正确获取字典。

let userDefaults = NSUserDefaults.standardUserDefaults()

if let dictionaryForUserDefaults = userDefaults.dictionaryForKey("cameraOrder") as? [Int: String] {

}

今天我调查这个问题。尝试使用真正的 Xcode 而不是 playground 进行测试。

当您运行输入Xcode中的代码时,您将收到。

Attempt to set a non-property-list object { 2 = 123512; 3 = 123512; 1 = 123512; 4 = 123512; } as an NSUserDefaults/CFPreferences value for key cameraOrder

可以断定Dictionary不是non-property-list object。让我们仔细阅读苹果文档:

And although NSDictionary and CFDictionary objects allow their keys to be objects of any type, if the keys are not string objects, the collections are not property-list objects.

所以你的情况下的键是 Int 并且有问题。

要解决问题,请尝试:

let defaults = NSUserDefaults.standardUserDefaults()

let key = "cameraOrder"

var dict: [String: String] = [:]
dict["1"] = "123512"
dict["2"] = "1231232"
dict["3"] = "112512"
dict["4"] = "1212081"

print(dict)

defaults.setObject(dict, forKey: key)