您的位置:首页 > Web前端 > JavaScript

从 JSON 到 Model: 协议默认方法让生活更简单

2016-12-25 14:54 477 查看

背景

从 API 生成 Model 代码开源脚本
中生成的模型代码中, 我们默认生成了
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
}


上面的代码,对于 Swift 来说, 还有很大的改进空间.
首先. 我们可以简化成一行代码, 如下:

func parseUsers(from data:JSON) -> [User]{
return data.map{ User(json:$0.1) }
}

够简单了吧. 使用 map 方法. 一行就 OK 了. 简单明了.
但是

终极简化

在 Swift 中我们可以一行代码都不写.就实现上面的功能.
怎么实现? 答案就在神奇的默认协议实现方法上.

我们对 Model 类提取一个协议出来
如下: 很简单,就是指定模型类可以从 JSON 反序列化成 Model.

public protocol JSONDeserializable {
init(json:JSON)
}


声明 User 实现了 上面的协议.

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 的声明.

借助 Swift 默认协议. 简化 Model 数组的反序列化.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Swift JSON in Swift POP