使用@AppStorage 保存唯一的字符串数组
Posted
技术标签:
【中文标题】使用@AppStorage 保存唯一的字符串数组【英文标题】:Save unique String Array With @AppStorage 【发布时间】:2021-12-11 15:19:08 【问题描述】:在以下示例中,我使用@AppStorage 保存一个字符串:
struct ContentView: View
@AppStorage("text") private var text = ""
var body: some View
Button("Append text: \(text)")
text.append("APPEND")
但我想保存一个唯一的字符串数组,如下所示:
@AppStorage("text") @State private var customer = [CustomerId]()
//
struct CustomerId: Identifiable
let id = UUID()
var number: String
init(_ number: String)
self.number = number
//
Button
customer
.append(CustomerId("New Id"))
【问题讨论】:
与您的(已接受!)previous question 有什么区别,除了它不是字符串数组,而是自定义对象的数组? 我正在与@State
和[CustomerId]()
合作,前一个不适合我:/
【参考方案1】:
强烈建议将修改模型的整个代码移动到一个称为视图模型的额外类中。
@AppStorage
属性包装器读取和写入 JSON 字符串。
@Published
属性包装器更新视图。
在init
方法中,保存的JSON 字符串被解码为[CustomerId]
。
appendCustomer
方法附加项目,将数组编码为 JSON 并将其写入磁盘。
class ViewModel : ObservableObject
@AppStorage("text") var text = ""
@Published var customer = [CustomerId]()
init()
customer = (try? JSONDecoder().decode([CustomerId].self, from: Data(text.utf8))) ?? []
func appendCustomer(_ sustomerId : CustomerId)
customer.append(sustomerId)
guard let data = try? JSONEncoder().encode(customer),
let string = String(data: data, encoding: .utf8) else return
text = string
struct ContentView : View
@StateObject private var model = ViewModel()
@State private var counter = 0
var body: some View
VStack
ForEach(model.customer) item in
Text(item.number)
Button("Append text: New Id \(counter)")
model.appendCustomer(CustomerId(number: "New Id \(counter)"))
counter += 1
【讨论】:
Class 'JSONDecoder' requires that 'CustomerId' conform to 'Decodable'
:/
在自定义类型中采用 Decodable
并添加 CodingKeys以上是关于使用@AppStorage 保存唯一的字符串数组的主要内容,如果未能解决你的问题,请参考以下文章