如何在模型中使用 Decodable?

word卡尔 发布于 5个月前 分类:电子书

把协议名称放在类型名字后面,并用冒号隔开,代表我们 声明 使用这个协议了。只有当一个类型满足这个协议的所有要求的时候,我们才能说这个类型 遵从 那个协议了。 对于 Decodable 而言,唯一的要求就是 init(from:) 初始化方法。

struct Plane: Decodable { var manufacturer: String var model: String var seats: Int }

init(from:) 初始化方法接受一个 Decoder 参数。 Decoder 协议需要阐明将 Decodable 对象的表示解码成对象的要求。为了适应各种数据交换格式,解码器和编码器都使用名为 容器(container)的抽象。容器是用来存储值的,可以存储一个值也可以存储多个值,可以像字典一样有键去对应值,也可以像数组一样不需要键。

因为上面那个 JSON 表示的顶层有一个对象, 所以我们就创建一个有键的容器,然后用不同的键来解码各个属性。

我们创建一个 CodingKeys 枚举,定义属性名称和容器的键之间的映射。这个枚举声明其原始类型是 String,同时声明使用 CodingKey 协议。因为每个名字都和 JSON 中的键相同,所以我们不用为这个枚举提供明确的原始值。

struct Plane: Decodable { // ... private enum CodingKeys: String, CodingKey { case manufacturer case model case seats } }

接下来,在 init(from:) 初始化函数里我们创建一个键控容器,调用 decoder 的 container(keyedBy:) 方法,并传入 CodingKeys 作为参数。

4. 后缀 self 的表示方式允许类型像值一样被使用。

最后,我们调用 container 的 decode(_:,forKey:) 方法把每个属性初始化一下。

init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.manufacturer = try container.decode(String.self, forKey: .manufacturer) self.model = try container.decode(String.self, forKey: .model) self.seats = try container.decode(Int.self, forKey: .seats) }

我们有了一个 Plane 模型,也遵从了 Decodable 协议,现在我们可以从 JSON 表示中创建一个 Plane 对象了。准备起飞。

更多详情查看:https://www.nigaea.com/498.html

 

0个回复

  • 暂无回复

联系我们

侵权投诉:nerds@nigaea.com

工作时间:周一至周五,9:30-18:00,节假日休息

QR code