当来自模型时如何将数据保存在用户默认值中

Posted

技术标签:

【中文标题】当来自模型时如何将数据保存在用户默认值中【英文标题】:How to save data in userdefaults when is from a model 【发布时间】:2019-11-24 21:26:37 【问题描述】:

我有一个这样的模型

struct House: Codable 
    let address: String?
    let rooms: String?
    let garage: Garage


struct Garage: Codable 
    let space: String?
    let numbers_of_ cars: String?

我从 api 获取数据并设置为可以显示它, 现在我需要保存在 userdefaults 中,以便在没有任何网络 o wifi 时显示信息

我正在尝试这样

var itemItems = [House]()

fileprivate func fetchData() 
        Service.shared.fetchCourses  (houses, err) in
            if let err = err 
                print("Failed to fetch houses:", err)
                return
            

        self.itemItems = houses!

        var itemsToSave = [House]()
        for i in 0..<self.itemItems.count 
            itemsToSave.append(self.itemItems[i])
        

        UserDefaults.standard.set(arrayToSave, forKey : "arrayToSave")

        
    

但是!!我收到一个错误 查看图片

https://i.ibb.co/bHhtj28/Captura-de-Pantalla-2019-11-24-a-la-s-4-25-18-p-m.png

【问题讨论】:

【参考方案1】:

您不能将自定义结构直接保存到UserDefaults

但是由于两个结构都符合Codable 编码它们

var itemItems = [House]()

fileprivate func fetchData() 
    Service.shared.fetchCourses  (houses, err) in
        if let err = err 
            print("Failed to fetch houses:", err)
            return
        

        self.itemItems = houses!
        do 
           let data = try JSONEncoder().encode(self.itemItems)
           UserDefaults.standard.set(data, forKey : "houses")
         catch  print(error)       
    

【讨论】:

不错!现在我没有错误,但是,当我尝试让数据不起作用时让 getDataHouses = UserDefaults.standard.string(forKey: "houses") ?? ““ 是正确的?因为当我打印它时,是“” 当然你必须用JSONDecoder加载和解码Data 我正在这样做,但我得到了错误,请帮助:) let dataHousesStore = UserDefaults.standard.data(forKey: "houses")! do let jsonDecoder = JSONDecoder() let dataFinal = try jsonDecoder.decode(House.self, from: dataHousesStore) catch print("error" , error) 阅读错误信息。你必须解码[House].self,一个数组。

以上是关于当来自模型时如何将数据保存在用户默认值中的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 将数组保存和检索到用户默认值

在应用加载时保存为用户默认值

如何将数据保存在firebase父键中不是默认值

如何将 JSON 令牌保存到用户默认值,然后在不同的视图中使用它?斯威夫特 4

如何将默认反应上下文值设置为来自 Firestore 的数据?

如何添加到当前存储在用户默认值 Swift 4 中的数字