
之前介绍的模型字段生成代码中, 我们默认生成了 init(json:JSON) 方法. 假设就是如下的 User Model
struct User{ let name:String let age:Int init(json: JSON) { self.name = json["name"].stringValue self.age = json["age"].intValue } } 开发中我们经常需要得到的是 一个 User 数组.
func parseUsers(from data:JSON) -> [User]{ var array:[User] = [] for (index,json) in data{ array.append(User(json:json)) } return array } func parseUsers(from data:JSON) -> [User]{ return data.map{ User(json:$0.1) } } 够简单了吧. 使用 map 方法. 一行就 OK 了. 简单明了. 但是
在 Swift 中我们可以一行代码都不写.就实现上面的功能. 怎么实现? 答案就在神奇的默认协议实现方法上.
public protocol JSONDeserializable { init(json:JSON) } extension User:JSONDeserializable{ } 因为我们实际上已经实现了. 所以我们不要额外写代码了.
JSONDeserializable 添加一个默认协议静态方法. 用来将 JSON 数组转换成 Model 数组. 如下.extension JSONDeserializable{ public static func objects(from json: JSON) -> [Self]{ return json.map{ Self(json:$0.1) } } } OK 大功告成!. 现在反序列化一个 User 数组的 json 只需要这样写就可以了.
let users = User.objects(from: json) 更重要 的是,所以其他的 Model 类型,只要添加实现 JSONDeserializable 的声明就拥有了从 JSON 数组反序列化的能力了.
至此,整个从 API 到 Model 的流程都变得无比简单,及别人愉快.
使用 generate_model 服务将 从 API 的 JSON 返回转化成 Model 的声明. (生成的代码中的 BXModel 协议,继承声明了 JSONDeserializable)
借助 Swift 默认协议. 简化 Model 数组的反序列化.
1 janita 2016-12-25 23:21:28 +08:00 via iPhone 用在什么地方呢? |
3 04BxPLXu2M6UKH6Z 2017-01-09 23:40:36 +08:00 POP 大法好 |
4 HHHH 2017-11-27 17:11:09 +08:00 py 大法好~~ |