关于Swift 4.1中的Codable改进详解
前言
Apple在Swift4.0中作了很多的改进,其中我个人最喜欢的就是Codable协议的出现。它让Swift自带了JSON、XML结构化数据和Model的映射和转换能力。
Codable最常见的使用场景就是:APP发起网络请求,然后我们将服务端响应的JSON数据转换为对应的Model实体。由于服务端的编程规范可能与客户端存在差异,Codable默认数据转换实现可能不再适用。例如,服务端可能使用的蛇形命名方式而客户端使用的是驼峰。此时我们就需要在客户端自己动手实现映射关系。
structMac:Codable{ varname:String varscreenSize:Int varcpuCount:Int } letjsonString=""" [ { "name":"MacBookPro", "screen_size":15, "cpu_count":4 }, { "name":"iMacPro", "screen_size":27, "cpu_count":18 } ] """ letjsonData=Data(jsonString.utf8) letdecoder=JSONDecoder() do{ letmacs=trydecoder.decode([Mac].self,from:jsonData) print(macs) }catch{ print(error.localizedDescription) }
上诉代码并不能完成理想的解码操作,因为Codable的默认实现无法将蛇形变量名映射到对应的驼峰属性上。所以在Swift4.0中我们需要对Mac进行部分改造:
structMac:Codable{ varname:String varscreenSize:Int varcpuCount:Int enumCodingKeys:String,CodingKey{ casename casescreenSize="screen_size" casecpuCount="cpu_count" } }
好在Swift4.1对此作出了改进。现在我们可以通过设置JSONDecoder的keyDecodingStrategy就能实现不同编程规范之间解码操作了。与之对应,JSONEncoder也有一个keyEncodingStrategy属性用于不同编程规范之间的编码操作。所以上诉代码可以简化为:
structMac:Codable{ varname:String varscreenSize:Int varcpuCount:Int } letjsonString=""" [ { "name":"MacBookPro", "screen_size":15, "cpu_count":4 }, { "name":"iMacPro", "screen_size":27, "cpu_count":18 } ] """ letjsonData=Data(jsonString.utf8) letdecoder=JSONDecoder() decoder.keyDecodingStrategy=.convertFromSnakeCase do{ letmacs=trydecoder.decode([Mac].self,from:jsonData) print(macs) }catch{ print(error.localizedDescription) }
如果你想进行反向转换操作的话,代码也非常简单:
letencoder=JSONEncoder() encoder.keyEncodingStrategy=.convertToSnakeCase letencoded=tryencoder.encode(macs)
当然,我们还可以对转换策略进行自定义实现以其实现一些特定需求。具体的使用方式可以参照代码
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。