将数据保存到 UserDefaults 时出现问题
Problems saving data to UserDefaults
我正在努力将一些日期保存到 UserDefaults。我有一个结构,一个我要保存的数组:
struct Habit: Identifiable, Codable {
var id = UUID()
var name: String
var comments: String
}
然后,在视图中,我有一个按钮可以将新习惯保存到一组习惯中,并将其放入 UserDefaults 中:
struct AddView: View {
@State private var newHabit = Habit(name: "", comments: "")
@State private var name: String = ""
let userData = defaults.object(forKey: "userData") as? [Habit] ?? [Habit]()
@State private var allHabits = [Habit]()
var body: some View {
NavigationView {
Form {
Section(header: Text("Habit name")) {
TextField("Jogging", text: $newHabit.name)
}
Section(header: Text("Description")) {
TextField("Brief comments", text: $newHabit.comments)
}
}
.navigationBarTitle("New habit")
.navigationBarItems(trailing: Button(action: {
allHabits = userData
allHabits.append(newHabit)
defaults.set(allHabits, forKey: "userData")
}) {
addButton
})
}
}
}
当我点击按钮时,我的应用程序因以下线程而崩溃:Thread 1: "Attempt to insert non-property list object (\n \"HabitRabbit.Habit(id: 574CA523-866E-47C3-B56B-D0F85EBD9CB1, name: \\"Wfs\\", comments: \\"Sdfdfsd\\")\"\n) for key userData"
我做错了什么?
采用 Codable
本身并不能使对象 属性 列表兼容,您必须对对象进行编码和解码 Data
。
像这样
func loadData() -> [Habit]
guard let userData = defaults.data(forKey: "userData") else { return [] }
return try? JSONDecoder().decode([Habit].self, from: userData) ?? []
}
func saveData(habits : [Habit]) {
guard let data = try? JSONEncoder().encode(habits) else { return }
defaults.set(data, forKey: "userData")
}
我正在努力将一些日期保存到 UserDefaults。我有一个结构,一个我要保存的数组:
struct Habit: Identifiable, Codable {
var id = UUID()
var name: String
var comments: String
}
然后,在视图中,我有一个按钮可以将新习惯保存到一组习惯中,并将其放入 UserDefaults 中:
struct AddView: View {
@State private var newHabit = Habit(name: "", comments: "")
@State private var name: String = ""
let userData = defaults.object(forKey: "userData") as? [Habit] ?? [Habit]()
@State private var allHabits = [Habit]()
var body: some View {
NavigationView {
Form {
Section(header: Text("Habit name")) {
TextField("Jogging", text: $newHabit.name)
}
Section(header: Text("Description")) {
TextField("Brief comments", text: $newHabit.comments)
}
}
.navigationBarTitle("New habit")
.navigationBarItems(trailing: Button(action: {
allHabits = userData
allHabits.append(newHabit)
defaults.set(allHabits, forKey: "userData")
}) {
addButton
})
}
}
}
当我点击按钮时,我的应用程序因以下线程而崩溃:Thread 1: "Attempt to insert non-property list object (\n \"HabitRabbit.Habit(id: 574CA523-866E-47C3-B56B-D0F85EBD9CB1, name: \\"Wfs\\", comments: \\"Sdfdfsd\\")\"\n) for key userData"
我做错了什么?
采用 Codable
本身并不能使对象 属性 列表兼容,您必须对对象进行编码和解码 Data
。
像这样
func loadData() -> [Habit]
guard let userData = defaults.data(forKey: "userData") else { return [] }
return try? JSONDecoder().decode([Habit].self, from: userData) ?? []
}
func saveData(habits : [Habit]) {
guard let data = try? JSONEncoder().encode(habits) else { return }
defaults.set(data, forKey: "userData")
}