Неоднозначная ссылка на член 'decodeIfPresent (_: forKey :) - PullRequest
0 голосов
/ 10 апреля 2019

Есть ли способ сделать кодируемый из [String: Any]? Я использую SwiftyJSON и похоже, что часть кодирования не дает никакой ошибки

struct MyClass: Codable {
    var my_label: [String: Any]?

    enum CodingKeys: String, CodingKey {
        case my_label   = "my_label"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        my_label = try values.decodeIfPresent([String: Any].self, forKey: .my_label)

    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encodeIfPresent(JSON(my_label as Any), forKey: .my_label)
    }
}

некоторые из примеров показывают, что my_label будет выглядеть так, хотя нет никакой гарантии, поэтому это Any

            "my_label": {
                "condition": {
                    "IsOpen": "Yes"
                },
                "label": "Test Completed:"
            },

1 Ответ

0 голосов
/ 10 апреля 2019

Вы можете использовать JSONSerialization, но с Decodable Any нельзя использовать

do {
    let json = try JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
    if let res = json["my_label"] as? [String:Any] {
        print(res)
    }
} catch {
    print(error)
}

Или

struct Root: Codable {
    let myLabel: MyLabel

    enum CodingKeys: String, CodingKey {
        case myLabel = "my_label"
    }
}

struct MyLabel: Codable {
    let condition: Condition
    let label: String
}

struct Condition: Codable {
    let isOpen: String

    enum CodingKeys: String, CodingKey {
        case isOpen = "IsOpen"
    }
}
...