【发布时间】:2019-12-25 06:33:21
【问题描述】:
这行代码的语法是否正确?如果不是,那么正确的语法是什么?为什么会这样?
UserDefaults.standard.dictionary(forKey: "mainDict")?.updateValue(subDict, forKey: "subDictTitle")
【问题讨论】:
标签: swift dictionary syntax nsuserdefaults
这行代码的语法是否正确?如果不是,那么正确的语法是什么?为什么会这样?
UserDefaults.standard.dictionary(forKey: "mainDict")?.updateValue(subDict, forKey: "subDictTitle")
【问题讨论】:
标签: swift dictionary syntax nsuserdefaults
首先,您必须将 Userdefault 字典存储到临时字典中。然后您必须将数据添加到临时字典中。
无需将字典更新为 Userdefault。当您使用相同的键将 Dictionary 存储到 Usedefault 时,它会将旧字典替换为新字典。
UserDefaults.standard.set(YOUR_TEMPORARY_DICTIONARY, forKey: YOUR_KEY_NAME)
【讨论】:
updateValue(_:forKey:) 是字典的mutating 实例方法,这意味着它会更新字典的值。显然,为了改变一个实例,它必须是可变的,而在调用UserDefaults.standard.dictionary(forKey: "mainDict") 时不是。
即使你这样做了:
let myDict = ["k1": "Hello"]
UserDefaults.standard.register(defaults: ["myDict": myDict])
var mutable = UserDefaults.standard.dictionary(forKey: "myDict")!
mutable["k1"] = "HEY"
print(UserDefaults.standard.dictionary(forKey: "myDict")) // Optional(["k1": Hello])
用户默认设置的字典值不会改变,因为 mutable 只是它的副本。
为了澄清,它类似于实现:
UserDefaults.standard.register(defaults: ["k2": "this is my string"])
UserDefaults.standard.string(forKey: "k2") = "new string"
产生的错误
表达式不可赋值:函数调用返回不可变值
所以,为了解决这个问题,你应该做的是使用相同的键为用户默认设置一个新值(更新的字典):
var myDict = UserDefaults.standard.dictionary(forKey: "myDict")
myDict?.updateValue("Hey", forKey: "k1")
UserDefaults.standard.set(myDict, forKey: "myDict")
【讨论】: