Swift4中使用Codable协议

进行iOS开发时,与后台数据的交互格式通常是JSON,OC时代,有很多第三方可以完成JSON与Model的互转,都是基于Runtime来完成的,比如MJExtension、YYModel等。但是在Swift里,struct成了一等公民,身为值类型,在内存上优化了很多,所以要写Swift化的代码,Model通常是struct类型的,阿里开源的HandyJSON可以很好的完成互转,但是毕竟是第三方,还是原生的比较好(比如我今天更新Xcode9.3,然后就崩溃了,issue上一看,十几天前就有人用beta版遇到了,作者也没跟进问题,我索性都改成了Codable)。这一切在Swift4里通过Codable解决了,再也不用第三方了
比如,我们从后台获取了以下JSON数据:

{
  "nu" : "11111111111",
  "status" : "200",
  "ischeck" : "0",
  "condition" : "00",
  "data" : [
    {
      "location" : null,
      "ftime" : "2017-12-18 16:37:45",
      "time" : "2017-12-18 16:37:45",
      "context" : "快件已到达华林二路40号圆通营业厅妈妈驿站,如有疑问请联系15208326965"
    },
    {
      "location" : null,
      "ftime" : "2017-06-07 11:21:03",
      "time" : "2017-06-07 11:21:03",
      "context" : "北服小北门圆通速递妈妈驿站已发出自提短信,请上门自提,如有疑问请联系13370110797"
    }
  ],
  "message" : "ok",
  "com" : "yuantong",
  "state" : "5"
}

可以把这个数据粘贴到JSONConverter里:

完成JSON转struct

然后创建一个Model,粘贴过来,稍微修改一下,就可以了:

struct DetailModel: Codable {
    var state: String?
    var status: String?
    var data = [DetailDataModel]()
    var nu: String?
    var com: String?
    var message: String?
    var condition: String?
    var ischeck: String?
}

struct DetailDataModel: Codable {
    var ftime: String?
    var time: String?
    var context: String?
    var heightcm: String?
//也可以自定义属性名,比如后台有个json字段叫Height_cm,
//此时,我们需要自定义CodingKeys,必须全部写一遍,
//这个比较坑,如果某个属性不想从json里读取,可以在这里忽略
    enum CodingKeys: String, CodingKey {
        case ftime
        case time
        case context
        case  heightcm = "Height_cm"
    }
}

需要遵守Codable协议才能完成转换,接下来就是使用:

        let path = Bundle.main.url(forResource: "Json.geojson", withExtension: nil)
        
        let data = try? Data.init(contentsOf: path!)
        let model = try? JSONDecoder().decode(DetailModel.self, from: data!)
        
        print("model====\(model!)")
        
        let jsondic = try? JSONEncoder().encode(model!)
        let jsonstr = String.init(data: jsondic!, encoding: .utf8)
        
        print("jsonstr===\(jsonstr!)")

这里JSON数据是从Json.geojson文件里读取的

CodableDemo

你可能感兴趣的:(Swift4中使用Codable协议)