如何在 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?