【问题标题】:How would you use .updateValue() to add a sub-dictionary to a UserDefaults dictionary?您将如何使用 .updateValue() 将子字典添加到 UserDefaults 字典?
【发布时间】:2019-12-25 06:33:21
【问题描述】:

这行代码的语法是否正确?如果不是,那么正确的语法是什么?为什么会这样?

UserDefaults.standard.dictionary(forKey: "mainDict")?.updateValue(subDict, forKey: "subDictTitle")

【问题讨论】:

标签: swift dictionary syntax nsuserdefaults


【解决方案1】:

首先,您必须将 Userdefault 字典存储到临时字典中。然后您必须将数据添加到临时字典中。

无需将字典更新为 Userdefault。当您使用相同的键将 Dictionary 存储到 Usedefault 时,它会将旧字典替换为新字典。

UserDefaults.standard.set(YOUR_TEMPORARY_DICTIONARY, forKey: YOUR_KEY_NAME)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2022-01-11
      • 2016-06-15
      • 1970-01-01
      • 2021-12-30
      • 2013-09-28
      • 2018-07-27
      相关资源
      最近更新 更多