感慨
刚刚经历完毕业季,终于能有点空余时间来弄弄自己的博客了~
之前一直面试找工作,弄毕设(iOS端和后台都是用Swift写的 项目地址),写论文,和同学道别😭。。。
正文
前言
Codable是Swift4中新引入的一个协议。我一开始了解到这个协议是看了王巍的这篇博客不同角度看问题 - 从 Codable 到 Swift 元编程 当然,🐱神的这篇博客主要讲的是Mirror(映射对象的属性)
Codabel概念与使用
Codable是一个编码(Encoding)和解码(Decoding)的协议。类或者结构体遵循该协议,能让数据自动解码并生成该对象的实例,前提是该对象的属性都遵循Codable协议(常见有的String,Int,Double,Date,Data,URL),如果属性是Array或者Dictionary等集合类型,则必须保证集合类型中的元素都遵循Codable协议,像Dictionary< String, Any>类型中的Any就不遵循Codable协议,当然后面我会讲如何尽量在开发中避免该情况。
1 | let jsonStr = """ |
Codabel扩展
Codabel也支持枚举类型,如下~
1 | let jsonStr = """ |
网络层的设计
之前实习的时候接触过一个项目(当然原项目是Objective-C写的,我进入项目组后,强行弄成和Swift混编的项目,走过不少的坑,也坑了不少人😂)
原项目的的网络层主要是3层,最基本的一层是一个单例,基于AFN的AFHTTPSessionManager封装的一层网络请求(这一层是对项目无依赖的,单独拿出来放到哪个项目中都能用)。 第二层主要是基于项目的特性对Request和Response的设置统一设置,调用的是第一层的接口。第三层就是调用第二层的请求方法,然后每个接口写一个类方法(最后改类有500多行,还没加上分类的200多行的接口),然后在Controller中调用第三层的类方法实现业务。。。
由于之前没接触过其他大的项目,后面在自己的Swift项目中也借鉴了这种网络层的设计。
最近接触到另外一种更符合Swift的设计,就是今天的主题了~
1. 模型协议(CodableProtocol)
简单的封装了一下Codable协议,能够实现字典,JSONString,Data和模型的相互装换。
代码地址
(如果转化失败,可以查看抛出的错误)
2. 请求协议(RequestProtocol)
由于协议能定义关联对象,因此可以定义一个RequestProtol协议,关联一个遵循Codable协议的对象(作为模型)。至此,一个接口对应一个请求,一个请求对应一个模型
1 | import Alamofire |
3. 配合封装网络请求方法
1 | // 这里配合Alamofire以及SwiftyJSON使用 |
4. 具体使用例子
1 |
|
5. 如何避免模型中的Any等不遵循Codable协议的类型
目前我的解决方法是在使用模型的这层(可能是Controller,也可能是ViewModel)中再建立一个中间层ModelHandle(数据处理加工层),即遵循CodableProtocol协议的模型是瘦模型,该模型的属性只存网络请求下来后的有用的数据。然后在ModelHandle中对模型进行处理加工,添加一些Controller或者ViewModel需要的但不遵循Codable协议的一些属性。然后在Controller或者ViewModel中使用数据加工层。
1 | struct StudentModelHandle { |