Swift - 编码和解码字典 [String :Any] into plist

标签 swift dictionary encoding nested decode

我试图将字典存储在我的类标记中,但它抛出一个错误,指出它不可编码或不可解码。我可以看到错误是由 [String: Any] 引起的,但我该如何解决它?

var buttonActions : [String: [String: [String:Any]]] = [:]

保存和加载

func saveData() {
    let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("\(fileName).plist")

    let encoder = PropertyListEncoder()
    do {
        let data = try encoder.encode(markerArray)
        try data.write(to: dataFilePath!)
        print("Saved")
    } catch {
        print("Error Encoding \(error)")
    }
}

func loadData() {
    let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("\(fileName).plist")

    if let data = try? Data(contentsOf: dataFilePath!){
        let decoder = PropertyListDecoder()
        do {
            markerArray = try decoder.decode([Marker].self, from: data)
        } catch {
            print("Decode Error \(error)")
        }
    }

class Marker : Encodable, Decodable {
    var UUIDpic: UUID = UUID()
    var alpha: Int = 1
    var buttonType: Int = 0
    var buttonActions : [String: [String: [String:Any]]] = [:]
    var buttonNameColor: String = ""
    var buttonNameFontSize: Int = 10
    var buttonShape: String = ""
    var loggerRect: String = ""
    var maskColor: String = ""
    var name: String = ""
}

最佳答案

不幸的是,您不能对包含 Any 的泛型类型使用 encodedecode(例如 [String: Any][任何])。 Any 不符合协议(protocol) Encodable 也不符合 Decodable 并且 Swift 不知道如何对其进行编码/解码。您必须为字典使用具体的泛型类型(例如 [String: String])。

如果你仍然需要使用像 Any 这样的通用类型,你必须实现 encode(to:)init(from:)方法。另一种选择是使用 struct 而不是 [String: [String: [String:Any]]] ,它符合 Codable ( 可编码和可解码)。您仍然需要在该结构中实现 encode(to:)init(from:) 方法,但好的一面是您不必编写 encoder.encode() 所有属性的故事,就像您在 Marker 类中实现它们一样。

关于Swift - 编码和解码字典 [String :Any] into plist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53585848/

相关文章:

ios - 如何在 Storyboard中表示启动屏幕

Swift:向下转换为已知类型

uitableview - 快速隐藏Tableview的静态单元格

ios - 如何将 View 左下对齐到多行 UILabel 的文本

python - Pandas 数据框到字典值

xslt - 如何从 xsltproc 输出 iso-8859-1 字符集?

ios - Little-Endian 字节顺序(iOS,BLE 扫描响应)

python - 可以从 Python 中的列表字典中提取列表吗?

python - 当我有一个列表元组对象时如何合并键的值

ios - 无法在 Swift 中编码字符串数组