文档章节

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

代码会说话
 代码会说话
发布于 2016/12/25 14:54
字数 512
阅读 39
收藏 0

背景

从 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 数组.

完善之路

  1. 也许我们会写如下的方法:
func parseUsers(from data:JSON) -> [User]{
  var array:[User] = []
  for (index,json) in data{
  		array.append(User(json:json))
  }
  return array
}
  1. 上面的代码,对于 Swift 来说, 还有很大的改进空间. 首先. 我们可以简化成一行代码, 如下:
func parseUsers(from data:JSON) -> [User]{
  return data.map{ User(json:$0.1) }
}

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

终极简化

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

  1. 我们对 Model 类提取一个协议出来 如下: 很简单,就是指定模型类可以从 JSON 反序列化成 Model.
public protocol JSONDeserializable {
  init(json:JSON)
}
  1. 声明 User 实现了 上面的协议.
extension User:JSONDeserializable{ 
}

因为我们实际上已经实现了. 所以我们不要额外写代码了.

  1. 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 的流程都变得无比简单,及别人愉快.

  1. 使用 generate_model 服务将 从 API 的 JSON 返回转化成 Model 的声明.

  2. 借助 Swift 默认协议. 简化 Model 数组的反序列化.

© 著作权归作者所有

代码会说话
粉丝 184
博文 62
码字总数 58384
作品 0
南宁
后端工程师
私信 提问
从YYModel源码中可以学到什么:前篇

前言 一个高性能模型框架。 作者在上给出的性能对比图(iphone 6 y:时间) :具体以下特点:高性能、自动类型转换、类型安全、非侵入性、轻量等。 关于如何使用查看文档和示例【传送门】。 本...

Owenli_千
2017/12/29
0
0
IOS——UIWebView基本使用与JS交互

1、UIWebView的几种加载方式 加载本地的HTML文件 通过NSURLRequest加载: 通过NSString加载: UIWebView 还支持将一个NSString对象作为源来加载。你可以为其提供一个基础URL,来指导UIWebVi...

一人丨星空
2016/09/23
269
0
Cakephp的魔法函数解析,findBy…

Cakephp的一个非常有意思的特色,就是,可以通过它的Model使用类似于findBy(Fields)这样的方法直接取得数据的调用,例如,我们可以直接取得ID为5的数据,可以这样: 就这么简单,但是,你会...

ZhaoChengye
2010/04/20
406
0
关于目前自己iOS项目使用的第三方开源库

1.AFNetworking   目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理。 2.FMDB   对sqlite数据库操作进行了封装,demo也比较简单。 3.MBProg...

-Man
2015/12/01
52
0
CRUD并不易-- --谈微服务中的序列化场景

在上一篇文章中说到了验参,现在接着说另一个微服务中的工程性问题,序列化。 作为编写业务的程序员,常被戏称为CRUD程序写,会增删改查,给个if else给个for就能混碗饭吃。此话倒不假。 在面...

古二白
2018/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

手持式人证核验设备助力国家安全系统

手持式人证核验设备,是针对公共安全领域的移动化身份核验、追逃等需求推出的手持式一体化设备。其特点是具备人员信息采集、存储和比对功能,将采集到的人脸信息与居民身份证芯片中的人脸信息...

非思丸智能FaceTo
13分钟前
4
0
好程序员web前端教程分享JavaScript简写方法

今天好程序员web前端教程为大家分享JavaScript简写方法,小伙伴们快来看一看吧。 1.三元操作符 当想写if...else语句时,使用三元操作符来代替。 constx =20; let answer; if(x >10) { answer...

好程序员官网
17分钟前
4
0
PHP面试题2019年小米工程师面试题和答案解析

一、单选题(共29题,每题5分) 1.PHP面向对象方法重写描述错误的是? A、子类必须继承父类 B、子类可以重写父类已有方法 C、重写之后子类会调用父类方法 D、子类也可以具有与父类同名的属性...

一个PHP程序媛
21分钟前
3
0
K8s 从懵圈到熟练 – 镜像拉取这件小事

导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的。而镜像拉取失败,大多数情况下都和权限有关。所以,在处理相关问题的时候,我们往往会轻松的说:这问题很简单...

Mr_zebra
21分钟前
4
0
分布式锁简单入门以及实现方法

学过Java多线程的应该都知道什么是锁,没学过的也不用担心,Java中的锁可以简单的理解为多线程情况下访问临界资源的一种线程同步机制。 在学习或者使用Java的过程中进程会遇到各种各样的锁的...

yanlijun_java
24分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部