Как сохранить данные в пользовательских настройках, когда они взяты из модели

У меня есть такая модель

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, чтобы можно было отображать информацию, если нет сети или Wi-Fi

Я пытаюсь вот так

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-pm.png


person mikeroberts    schedule 24.11.2019    source источник


Ответы (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) }      
    }
}
person vadian    schedule 24.11.2019
comment
отлично! теперь у меня нет ошибки, но посмотрите, когда я пытаюсь получить данные, которые не работают, пусть getDataHouses = UserDefaults.standard.string (forKey: homes) ?? правильно? потому что когда я его печатаю, это - person mikeroberts; 25.11.2019
comment
Конечно, вы должны загрузить и декодировать Data с помощью JSONDecoder. - person vadian; 25.11.2019
comment
я делаю так, но получаю ошибку, помогите пожалуйста :) let dataHousesStore = UserDefaults.standard.data (forKey: homes)! do {let jsonDecoder = JSONDecoder () let dataFinal = try jsonDecoder.decode (House.self, from: dataHousesStore)} catch {print (error, error)} - person mikeroberts; 25.11.2019
comment
Пожалуйста, прочтите сообщение об ошибке. Вы должны декодировать [House].self, массив. - person vadian; 25.11.2019