关于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)
当然,我们还可以对转换策略进行自定义实现以其实现一些特定需求。具体的使用方式可以参照代码
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。