如何将新元素附加到 Userdefaults (SwiftUI) 中的数组

How can I append an new Element to an Array in the Userdefaults (SwiftUI)

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

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

但是我得到这个错误代码:

Cannot use mutating member on immutable value: function call returns immutable value

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

您需要将函数的结果赋值给变量才能修改它

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

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

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 并创建一个带有 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"]