【问题标题】:How can I append an new Element to an Array in the Userdefaults (SwiftUI)如何在 Userdefaults (SwiftUI) 中将新元素附加到数组
【发布时间】:2021-03-16 21:37:26
【问题描述】:

我想在 Userdefaults 中有一个字符串数组,我可以对其进行编辑。这意味着我想将新项目附加到这个数组。这里是一些示例代码

var defaults = UserDefaults.standard
defaults.array(forKey: "myArray")?.append("NewElement")

但我得到这个错误代码:

不能对不可变值使用变异成员:函数调用返回不可变值

我该如何处理?你需要更多的信息?谢谢你的时间 布托什

【问题讨论】:

    标签: swift swiftui userdefaults


    【解决方案1】:

    你需要将函数的结果赋值给变量,然后才能修改它

    if var array = defaults.array(forKey: "myArray") {
         array.append("NewElement")
    }
    

    【讨论】:

      【解决方案2】:

      您可以扩展 UserDefaults 并使用 getter 和 setter 创建计算属性。这样您就可以直接从磁盘直接访问您的阵列:

      extension UserDefaults {
          var myStringArray: [String] {
              get { stringArray(forKey: "myStringArray") ?? [] }
              set { set(newValue, forKey: "myStringArray") }
          }
      }
      

      用法:

      UserDefaults.standard.myStringArray.append("NewElement")
      UserDefaults.standard.myStringArray  // ["NewElement"]
      

      【讨论】:

        【解决方案3】:

        您可以保存或读取数组,但您应该在保存之前完成您的工作,然后您可以在读取后开始使用或添加新数据。

        PS:我使用 SwiftUI 进行展示,但 saveData()readData() 函数也可以在 UIKit 中使用。

        import SwiftUI
        
        
        struct ContentView: View {
        
            var body: some View {
                
                VStack(spacing: 20) {
                    
                    Button("saveData") { saveData() }
                    
                    Button("readData") { readData() }
        
                }
                .font(Font.body.weight(Font.Weight.bold))
        
            }
            
        }
        

        func saveData() {
            
            var array: [String] = [String]()
            
            array.append("a")
            array.append("b")
            array.append("c")
            
            UserDefaults.standard.set(array, forKey: "array")
            
            print("saved!")
            
        }
        

        func readData() {
            
            if let unwrappedData = UserDefaults.standard.stringArray(forKey: "array") {
                
                var array: [String] = unwrappedData
                
                array.append("d")
                
                print(array)
                
            }
            
        }
        

        【讨论】:

        • UserDefaults 有一个特定的方法来检索称为stringArray(forKey:) 的字符串数组。无需将元素从Any 映射到String
        • if var array = UserDefaults.standard.stringArray(forKey: "array") {
        • 顺便说一句,铸造也可以array(forKey: "array") as? [String]
        • 无需创建另一个对象。您可以简单地使用if var 而不是if let。检查我的第二条评论
        • 是的,我想保持 if let 规则不变。但完全同意你的看法。
        猜你喜欢
        • 1970-01-01
        • 2018-05-16
        • 2012-08-30
        • 2021-09-16
        • 2018-04-11
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        相关资源
        最近更新 更多