如何使用[String:Any]?作为Struct中符合Codable的属性

时间:2019-04-19 15:53:54

标签: swift codable

我有一个符合协议Codable的结构。我有[String:Any]类型的属性?但是该codable不允许我使用它。说出错误

does not conform to protocol 'Decodable

1 个答案:

答案 0 :(得分:0)

如果需要,可以使用旧的JSONSerialization类在Data[String: Any]之间进行转换。 Data是可编码的。您还可以使用另一种格式,例如String。请注意,swift是强类型的,因此与Any相比,通常首选使用具有关联值的枚举。如果目的是实际写服务器而不是本地存储,那么您也可以考虑只忘记Codable并在整个过程中使用JSONSerialization。

示例:

import UIKit
import PlaygroundSupport

struct A: Codable {
    let a: Int
    let b: [String: Any]

    enum CodingKeys: String, CodingKey {
        case a
        case b
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        a = try values.decode(Int.self, forKey: .a)
        let data = try values.decode(Data.self, forKey: .b)
        b = try JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(a, forKey: .a)
        let data = try JSONSerialization.data(withJSONObject: b, options: [])
        try container.encode(data, forKey: .b)
    }
}