使用 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
中添加两个方法 load 和 save 任务和一个 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 以跨会话存储数据。
谁能帮我用 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
中添加两个方法 load 和 save 任务和一个 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 以跨会话存储数据。