微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将数据保存到 UserDefaults 时出现问题

如何解决将数据保存到 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")
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。