使用 struct id 将收藏夹保存到 UserDefaults

问题描述

我正在尝试将用户最喜欢的城市保存在 UserDefaults 中。发现此解决方案保存结构 ID - 构建并运行但似乎没有保存:在应用重新启动时,先前点击的按钮被重置。

我很确定我遗漏了什么......

这是我的数据结构和类:

struct City: Codable {
    var id = UUID().uuidString
    var name: String
}

class Favorites: ObservableObject {
    private var cities: Set<String>
    let defaults = UserDefaults.standard

    var items: [City] = [
        City(name: "London"),City(name: "Paris"),City(name: "Berlin")
    ]

    init() {
        let decoder = PropertyListDecoder()
        if let data = defaults.data(forKey: "Favorites") {
            let cityData = try? decoder.decode(Set<String>.self,from: data)
            self.cities = cityData ?? []
            return
        } else {
            self.cities = []
        }
    }

    func getTaskIds() -> Set<String> {
        return self.cities
    }

    func contains(_ city: City) -> Bool {
        cities.contains(city.id)
    }

    func add(_ city: City) {
        objectWillChange.send()
        cities.contains(city.id)
        save()
    }

    func remove(_ city: City) {
        objectWillChange.send()
        cities.remove(city.id)
        save()
    }

    func save() {
        let encoder = PropertyListEncoder()
        if let encoded = try? encoder.encode(tasks) {
            defaults.setValue(encoded,forKey: "Favorites")
        }
    }
}

这里是 TestDataView

struct TestData: View {

    @StateObject var favorites = Favorites()
    
    var body: some View {
        ForEach(self.favorites.items,id: \.id) { item in
            VStack {
                Text(item.title)
          
                Button(action: {
                    if self.favorites.contains(item) {
                        self.favorites.remove(item)
                    } else {
                        self.favorites.add(item)
                    }
                }) {
                    HStack {
                        Image(systemName: self.favorites.contains(item) ? "heart.fill" : "heart")
                            .foregroundColor(self.favorites.contains(item) ? .red : .white)
                    }
                }
            }
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)