【问题标题】:How to save Dictionary<String, Any> to UserDefaults?如何将 Dictionary<String, Any> 保存到 UserDefaults?
【发布时间】:2020-04-20 09:44:43
【问题描述】:

我在将字典保存到 UserDefaults() 时有点困难。

尝试UserDefaults.standard.set(dict1, forKey: "dict1",但出现错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试插入非属性列表对象

也试过NSKeyedArchiver,但是弹出这个错误:

由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[__SwiftValue encodeWithCoder:]: unrecognized selector sent to instance

这是字典:

@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。 有什么帮助或提示吗?提前谢谢!

【问题讨论】:

  • 这可能是因为您尝试存储 Color.green。尝试删除它(现在),看看会发生什么。
  • 正如 Rob 提到的那样,您 - 绝对 - 无法保存 Color,因为它不符合 NSCoding。在 Swift 中有比 objective-c-ish NSKeyedArchiver 更好的方法
  • 问题在于存储 Color.green。您必须将其转换为数据,然后以相同的方式恢复。
  • 好的,谢谢。只是使用十六进制值代替颜色 - 似乎是一个更简单的解决方法!

标签: swift swiftui nsuserdefaults


【解决方案1】:
        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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多