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

STe*_*ier 0 encoding dictionary nested decode swift

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

var buttonActions : [String: [String: [String:Any]]] = [:]
Run Code Online (Sandbox Code Playgroud)

保存和加载

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)")
        }
    }
Run Code Online (Sandbox Code Playgroud)

班级

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 = ""
}
Run Code Online (Sandbox Code Playgroud)

And*_*caș 5

不幸的是,您不能在包含(例如或)的泛型类型上使用encode或。不符合协议也和斯威夫特不知道如何编码/解码。您必须为您的字典使用具体的泛型类型(例如)。decodeAny[String: Any][Any]AnyEncodableDecodable[String: String]

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