然后,在 Swift 代码中,想要将此类 Json 响应转换为 CurrencyConversion 实例,每个实例都包含一个 ExchangeRate 条目数组,每个币种对应一个:
struct CurrencyConversion {
var currency: Currency
var exchangeRates: [ExchangeRate]
}
struct ExchangeRate {
let currency: Currency
let rate: Double
}
复制代码
但是,如果仅仅只是使以上两个模型都符合 Codable,将再次导致 Swift 代码与要解码的 Json 数据不匹配。但是这次,不只是关键字名称的问题,结构上有根本的不同。当然,可以修改 Swift 模型的结构,使其与 Json 数据的结构完全匹配,但这并不总是可行的。尽管拥有正确的序列化代码很重要,但是拥有适合实际代码库的模型结构也同样重要。
相反,创建一个新的专用类型,它将在 Json 数据中使用的格式与 Swift 代码的结构体之间架起一座桥梁。在这种类型中,我们将能够封装将 Json 汇率字典转换为一系列 ExchangeRate 模型所需的所有逻辑,如下所示:
private extension ExchangeRate {
struct List: Decodable {
let values: [ExchangeRate]
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let dictionary = try container.decode([String : Double].self)