使用 Codable 或 userDefaults 保存列表

Saving a list using Codable or userDefaults

谁能帮我用 Codable 或其他方法保存此代码中的列表。我无法在代码中使用 UserDefaults。任何人都可以帮助我如何使用保存列表,以便无论何时,我重新打开我的应用程序,列表仍然存在。谢谢

import SwiftUI
struct MainView: View {

    @State var br = Double()
    @State var loadpay = Double()
    @State var gp : Double = 0
    @State var count: Int = 1
    @State var listcheck = Bool()
    @StateObject var taskStore = TaskStore()
 @State var name = String()
    var userCasual = UserDefaults.standard.value(forKey: "userCasual") as? String ?? ""
    func addNewToDo() {
         taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem:  "load \(count)", amount: Double(gp)))
   }
    func stepcount() {
       
     count += 1
        
    }
    var body: some View {
        VStack {
            TextField("Name", text: $name)
            HStack {
            Button(action: { gp += loadpay }) {
                Text("Add Load")
            }
            Button(action: {
                addNewToDo()
            }) {
                Text("Check")
            }
        }
            Form {
                ForEach(self.taskStore.tasks) {
                    task in
                    Text(task.toDoItem)
                }
            }
        }
        Button(action: {
            UserDefaults.standard.set(name, forKey: "userCasual")})
        {Text("Save")}

}

}
struct Task : Identifiable {
    var id = String()
    var toDoItem = String()
    var amount : Double = 0
}

class TaskStore : ObservableObject {
    @Published var tasks = [Task]()
}

Task采用Codable

struct Task : Codable, Identifiable {
    var id = ""
    var toDoItem = ""
    var amount = 0.0
}

TaskStore 中添加两个方法 loadsave 任务和一个 init 方法

class TaskStore : ObservableObject {
    @Published var tasks = [Task]()
    
    init() {
        load()
    }
    
    func load() {
        guard let data = UserDefaults.standard.data(forKey: "tasks"),
              let savedTasks = try? JSONDecoder().decode([Task].self, from: data) else { tasks = []; return }
        tasks = savedTasks
    }
    
    func save() {
        do {
            let data = try JSONEncoder().encode(tasks)
            UserDefaults.standard.set(data, forKey: "tasks")
        } catch {
            print(error)
        }
    }
}

在视图中调用taskStore.save()保存数据。

然而:对于大数据集UserDefaults是错误的地方。将数据保存在 Documents 文件夹中或使用 Core Data。

旁注:切勿在 UserDefaults 中使用 value(forKey:),在您的示例中有 string(forKey:)

您应该看一下@AppStorage 属性 包装器。这是 Paul Hudson 写的 great article,他是您学习 iOS.

的重要资源

UserDefaults 并不是存储持久信息的最佳方式。一旦您熟悉了 Swift 和 SwiftUI,您应该研究 CoreData 以跨会话存储数据。