【发布时间】:2017-06-10 02:18:47
【问题描述】:
我正在尝试向字典添加键和值,然后将此字典添加为用户默认值并读回字典对象。我有两个问题非常感谢您的帮助,
1) 为什么从用户默认读取的字典是空的?由于我在字典中添加了一个键和一个值,不应该将它们保存到我从用户默认值检索的字典中吗?
let defaults = UserDefaults.standard;
var myDict = [String: String]()
myDict["key"] = "value"
defaults.setValue(myDict, forKey: "myDict")
let mydict2 = defaults.object(forKey: "myDict") as? [String: String] ?? [String:String]()
print(mydict2)
2) 如果字典将我创建的自定义类存储为值或键,我可以对这段代码做什么,如果字典是这样的:
class Car {
var engineSize: Int
var color: String
init() {
engineSize = 2000
color = "blue"
}
}
class Boat {
var surfaceArea: Int
var weight: Int
init() {
surfaceArea = 3500
weight = 4000
}
}
var myDict = [Car: Boat]()
如何将第二个字典保存到用户默认值并从那里读取?
谢谢
编辑:
这是ebby94建议的答案:
var myDict = [String:String]()
myDict["key"] = "value";
let data = NSKeyedArchiver.archivedData(withRootObject: myDict)
UserDefaults.standard.set(data, forKey: "myDict")
func foo()
{
guard let archivedData = UserDefaults.standard.value(forKey: "myDict") as? Data
else
{
print("failed1")
return
}
guard var unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: archivedData) as? [String:String]
else
{
print("failed2")
return
}
print(unarchivedDictionary["key"]!)
}
foo()
但是打印失败 1,我假设数据未正确存档。这可能是因为我在操场上运行它吗?
【问题讨论】:
-
首先确保你在一个真实的项目中测试它(playground 不起作用)
-
第二个你需要让你的类 NSCoding 兼容。
-
第三次使用 KeyedArchiever 将您的对象转换为数据
-
也只需使用
set(yourObjectData, forKey: "theKey")而不是 setValue -
@LeoDabus 为什么要发布 6 个 cmets?发布答案或投票以作为骗子关闭(这必须是骗子)。
标签: ios swift dictionary nsuserdefaults