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

Posted

技术标签:

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

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

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

但我得到这个错误代码:

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

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

【问题讨论】:

【参考方案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 规则不变。但完全同意你的看法。

以上是关于如何在 Userdefaults (SwiftUI) 中将新元素附加到数组的主要内容,如果未能解决你的问题,请参考以下文章

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

SwiftUI:如何使用 UserDefaults 持久化 @Published 变量?

如何在 SwiftUI 中将颜色选择器值保存到 UserDefaults 中?

使用 @AppStorage 进行设置的 SwiftUI 最佳实践:如何在加载 @AppStorage 之前读取 UserDefaults?

在 SwiftUI 中使用 UserDefaults 进行全局更新

SwiftUI 从 UserDefaults.standard 存储和提取字典