我有一个符合协议Codable的结构。我有[String:Any]类型的属性?但是该codable不允许我使用它。说出错误
does not conform to protocol 'Decodable
答案 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)
}
}