使用@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 保存唯一的字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ViewModel 中使用带有自定义类型和 @Published 的 @AppStorage?

使用非零值初始化可选的 @AppStorage 属性

SwiftUI @AppStorage 不在函数中刷新

AppStorage 与 CoreData

保存唯一数组元素 MongoDB

SwiftUI:绑定到@AppStorage