当你实施Codable
对于一个对象,编译器可以自动为您生成一个构造函数。然而,只有当您没有编写自己接受解码器的初始化程序时,它才会执行此操作。
也就是说,我们有一个大约 50 的对象let
从解码器设置的属性,但我们还有五个基于这些属性的计算属性let
特性。
从技术上讲,如果我们可以在初始化程序中计算它们,那么在解码器设置其他 50 个之后,我们可以简单地将结果存储在let
它们自己的变量,完全消除了对计算属性的需要。
问题是,如前所述,如果您实现自己的初始化程序,编译器不会为您自动生成初始化程序,因此您不仅要初始化“计算”值,而且还要初始化“计算”值。all values.
那么有没有一种方法可以让您将自己插入到初始化/解码过程中,而不必自己完全重写初始化程序呢?
您正在寻找的内容与委托模式类似,解码器通知其委托已完成解码。遗憾的是,它还没有添加到 Swift 中。我能想到的最接近的是使用继承,这样 Swift 就可以自动生成这 50 个解码器let
在基类中,您可以在子类中初始化计算属性。例如:
class A: Decodable {
let firstName: String
let lastName: String
}
class B: A {
private var _fullName: String! = nil
var fullName: String { return _fullName }
required init(from decoder: Decoder) throws {
try super.init(from: decoder)
_fullName = firstName + " " + lastName
}
}
在 A 类中定义 50 个属性,并将所有计算属性保留在 B 类中。
或者根据您的建议,您也可以使用lazy var
:
struct Model: Decodable {
let firstName: String
let lastName: String
// private(set) so users cannot change value of the
// pre-computed property
lazy private(set) var fullName = self.firstName + " " + self.lastName
}
// But you can't use a let here, since calling fullName
// for the first time will mutate the struct
var model = try JSONDecoder().decode(Model.self, from: json)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)