美文网首页
Swift4中使用Codable协议

Swift4中使用Codable协议

作者: 青山不改 | 来源:发表于2018-03-29 20:23 被阅读310次

    进行iOS开发时,与后台数据的交互格式通常是JSON,OC时代,有很多第三方可以完成JSON与Model的互转,都是基于Runtime来完成的,比如MJExtensionYYModel等。但是在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协议

          本文链接:https://www.haomeiwen.com/subject/ztsvcftx.html