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)
我一直在尝试将类型为 [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)