默认情况下,Decodable
协议将 JSON 值转换为对象值而不进行任何更改。但有时您需要在 json 解码期间转换值,例如,在您获得的 JSON 中,{id = "id10"}
但在您的类实例中,您需要将数字10
放入属性中id
(甚至放入具有不同名称的属性中)。
您可以实现init(from:)
可以使用任何值执行所需操作的方法,例如:
public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
latitude = try container.decode(Double.self, forKey:.latitude)
longitude = try container.decode(Double.self, forKey: .longitude)
// and for example there i can transform string "id10" to number 10
// and put it into desired field
}
这对我来说听起来很棒,但是如果我只想更改其中一个JSON 字段的值而让我的所有其他 20 个字段保持不变怎么办?如果init(from:)
我应该为我班级的 20 个字段中的每一个字段手动获取和放置值!经过多年的 objC 编码,我很直观地首先调用 super 的实现,init(from:)
然后只对某些字段进行更改,但是我如何使用 Swift 和Decodable
协议实现这样的效果呢?