简评:Swift 4 研究了吗?Swift 给我们带来了 Codable 协议,让对象转 JSON Data 变得如此的简单有许多不同的场景,您希望将您的 Class 换为数据。 一个非常常见的需求是 HTTP POST 请求的时候 JSON 数据作为 HTTP Body。 最常见的方法之一如下所示:
<img src="https://pic3.zhimg.com/v2-9781fbefd5e56edbc886755856dbaf3e_b.png" data-rawwidth="1102" data-rawheight="580" class="origin_image zh-lightbox-thumb" width="1102" data-original="https://pic3.zhimg.com/v2-9781fbefd5e56edbc886755856dbaf3e_r.png">JSONSerialization class 负责返回 Data 对象,从而作为 HTTP 的请求体。
JSONSerialization class 负责返回 Data 对象,从而作为 HTTP 的请求体。
JSONEncoder and JSONDecoder in Swift 4
Swift 4 有两个类 JSONEncoder 和 JSONDecoder ,可以方便地用于对象和 JSON 之间进行转化:
<img src="https://pic2.zhimg.com/v2-54b10cf0a2cba08bff7045f38d656d65_b.png" data-rawwidth="1066" data-rawheight="556" class="origin_image zh-lightbox-thumb" width="1066" data-original="https://pic2.zhimg.com/v2-54b10cf0a2cba08bff7045f38d656d65_r.png">
typealias Codable = Decodable & Encodable
使用 Codable 协议指明 Language struct 可被编码和解码,然后使用 JSONEncoder 类的 encode 方法进行编码。
我们再看看下面这段代码,可以发现单纯的编码解码变得非常的简洁。
<img src="https://pic1.zhimg.com/v2-932c3bf3b676988ab19651a605cdc8dc_b.png" data-rawwidth="1074" data-rawheight="282" class="origin_image zh-lightbox-thumb" width="1074" data-original="https://pic1.zhimg.com/v2-932c3bf3b676988ab19651a605cdc8dc_r.png">很简单吧! 我们甚至可以通过使用协议和扩展来使其更简单。 我们创建一个自定义的可序列化协议来执行编码。
很简单吧! 我们甚至可以通过使用协议和扩展来使其更简单。 我们创建一个自定义的可序列化协议来执行编码。Serializable
但是这样还是需要创建 JSONEncoder 和 JSONDecoder 来为我们处理编解码,我们可以使用 协议和扩展来简化这些操作,举个例子。
<img src="https://pic3.zhimg.com/v2-22d51dd49d85940e7a007c80f7a1f24e_b.png" data-rawwidth="542" data-rawheight="136" class="origin_image zh-lightbox-thumb" width="542" data-original="https://pic3.zhimg.com/v2-22d51dd49d85940e7a007c80f7a1f24e_r.png">为了不让每个遵从 Serializable 的 class/struct 都是实现这个方法,扩展这个协议方法。
为了不让每个遵从 Serializable 的 class/struct 都是实现这个方法,扩展这个协议方法。
<img src="https://pic3.zhimg.com/v2-a6f9e0a82428890d9e006927eb4e04f2_b.png" data-rawwidth="744" data-rawheight="300" class="origin_image zh-lightbox-thumb" width="744" data-original="https://pic3.zhimg.com/v2-a6f9e0a82428890d9e006927eb4e04f2_r.png">上面这段代码,会报如下错误:
上面这段代码,会报如下错误: Playground execution failed: error: MyPlayground.playground:8:36: error: argument type ‘Self’ does not conform to expected type ‘Encodable’
return try? encoder.encode(self)
因为 Serializable 还不是 Codable ,所以还需要做些修改
<img src="https://pic1.zhimg.com/v2-437ebc56246a0d82d13acac3d1963894_b.png" data-rawwidth="604" data-rawheight="140" class="origin_image zh-lightbox-thumb" width="604" data-original="https://pic1.zhimg.com/v2-437ebc56246a0d82d13acac3d1963894_r.png">现在,您可以使用自建的协议轻松地对您的模型进行编码,如下所示:
现在,您可以使用自建的协议轻松地对您的模型进行编码,如下所示:<img src="https://pic1.zhimg.com/v2-657d1e8729486e6ba20201964c525d80_b.png" data-rawwidth="902" data-rawheight="102" class="origin_image zh-lightbox-thumb" width="902" data-original="https://pic1.zhimg.com/v2-657d1e8729486e6ba20201964c525d80_r.png">
注意:把 Language 从 “Codable” 换成 “Serializable” 协议。
很舒服!!
原文:Encoding and Decoding in Swift 4
推荐阅读: Swift 中 Literal 可以这么用,你造吗?
欢迎关注:知乎专栏「极光日报」,每天为 Makers 导读三篇优质英文文章。