在网络请求中,json转模型是最常见的操作了,在OC时代,我们通常用MJExtension进行转换。在Swift中,数据转换更加方便,只要模型遵循Codable协议,就可以原生进行转换。
例如,定义的模型如下:
struct SomeModel: Codable {
var name: String?
var size: Int?
}
服务器返回的数据是酱紫:
{
"name": "lesson",
"size": 10
}
然后我们可以进行data->struct的转换
let data = response.data
do {
let decoder = JSONDecoder()
//解析数据
self.model = try decoder.decode(SomeModel.self, from: data)
} catch let err {
print("Err ", err)
}
但是问题来了,有时候这个模型还需要别的存储属性,例如你需要一个名字为“is_show”的属性,默认值为false,于是struct改成了:
struct SomeModel: Codable {
var name: String?
var size: Int?
var is_show: Bool = false
}
乍一看好像没有问题,但是一运行,Xcode就报No value associated with key CodingKeys,认真想了一下,原来是把is_show赋初值后就忘记加上“?”了,这样它就不是可选类型,但是返回的数据中又没有这个字段,所以就报错了。因此,一个struct的存储属性应该都定义为可选类型。为了方便和安全,同时也应该赋初值。
最后修改成:
struct SomeModel: Codable {
var name: String? = ""
var size: Int? = 0
var is_show: Bool? = false
}