Как сохранить словарь в UserDefaults? - PullRequest
0 голосов
/ 20 апреля 2020

У меня небольшие трудности с сохранением словаря в UserDefaults ().

Попытка UserDefaults.standard.set(dict1, forKey: "dict1", но появляется ошибка:

Завершение работы приложения из-за необработанного исключения ' NSInvalidArgumentException ', причина:' Попытка вставить объект списка не-свойств

Также попытался NSKeyedArchiver, но всплывает эта ошибка:

Завершение работы приложения из-за необработанного исключения ' NSInvalidArgumentException ', причина:' - [__ SwiftValue encodeWithCoder:]: нераспознанный селектор, отправленный экземпляру

Это словарь:

@State var dict1: Dictionary<String, Any> = [
    "progress": Double(0.5),
    "count": 10,
    "max": 20,
    "name": "dict1",
    "value": Double(10.00),
    "color": Color.green,
    "completed": false,
    "incrament": Double(1)
]

Это Xcode 11 SwiftUI. Любая помощь или советы? Заранее спасибо!

1 Ответ

0 голосов
/ 20 апреля 2020
        struct LocalData {
        static var myDicts: [dictionary] {
                get {
                    guard let data = UserDefaults.standard.data(forKey: #function) else { return [] }
                    do {
                        let myDict = try JSONDecoder().decode([dictionary].self, from: data)
                        return myDict
                    } catch {
                        print(error)
                    }
                    return []
                }
                set{
                    let data = try! JSONEncoder().encode(newValue)
                    UserDefaults.standard.set(data, forKey: #function)
                    UserDefaults.standard.synchronize()
                }

        }
    }


struct dictionary: Codable {
    var progress: Double?
    var count: Int?
    var max: Int?
    var name: String?
    var value: Double?
    var color: String?
    var completed: Bool?
    var increment: Double?
    }

Использование:

var dict: [dictionary] = [dictionary(progress: 10, count: 10, max: 10, name: "mydict", value: 10.5, completed: true, increment: 10.4)]

    LocalData.myDicts = dict
    print(LocalData.myDicts)

для цвета вы можете сделать это:

if LocalData.myDicts[0].color == red {
 self.view.backgroundColor = .red
}else if LocalData.myDicts[0].color == green {
 self.view.backgroundColor = .green
}
...