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

如何将新元素附加到Userdefaults(SwiftUI)中的数组,swift,swiftui,userdefaults,Swift,Swiftui,Userdefaults,我想在Userdefaults中有一个字符串数组,我可以编辑它。这意味着我想将新项追加到此数组 var defaults = UserDefaults.standard defaults.array(forKey: "myArray")?.append("NewElement") 但我得到了这个错误代码: 无法对不可变值使用mutating成员:函数调用返回不可变值 我怎么办?你需要更多的信息吗?谢谢你的时间 Boothosh您需要将函数的结果分配给变量

我想在Userdefaults中有一个字符串数组,我可以编辑它。这意味着我想将新项追加到此数组

var defaults = UserDefaults.standard
defaults.array(forKey: "myArray")?.append("NewElement")
但我得到了这个错误代码:

无法对不可变值使用mutating成员:函数调用返回不可变值

我怎么办?你需要更多的信息吗?谢谢你的时间
Boothosh

您需要将函数的结果分配给变量,然后才能修改它

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

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

PS:我在show case中使用了SwiftUI,但是在UIKit中也可以使用saveData()readData()函数




您可以扩展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"]

UserDefaults
有一个特定的方法来检索字符串数组,名为
stringArray(forKey:)
。如果var array=UserDefaults,则无需将元素从
Any
映射到
String
。standard.stringArray(forKey:“array”){
Btw casting也可以像?[String]一样工作
array(forKey:“array”)
无需创建另一个对象。您只需使用
if var
而不是
if let
。检查我的第二条评论是的,我想保持if let规则不变。但完全同意您的意见。
func readData() {
    
    if let unwrappedData = UserDefaults.standard.stringArray(forKey: "array") {
        
        var array: [String] = unwrappedData
        
        array.append("d")
        
        print(array)
        
    }
    
}
extension UserDefaults {
    var myStringArray: [String] {
        get { stringArray(forKey: "myStringArray") ?? [] }
        set { set(newValue, forKey: "myStringArray") }
    }
}
UserDefaults.standard.myStringArray.append("NewElement")
UserDefaults.standard.myStringArray  // ["NewElement"]