基本上,我想创建两个属性,其中一个属性依赖于另一个属性。我发现,如果我尝试以这种方式初始化相关属性,那么它将无法正常工作。
class Bus {
private let driverList = ["A", "B", "C"]
private var driver: String = driverList.randomElement()!
@Published private var bus: String = createBus(driver: driver)
static func createBus(driver: String) -> String {
return "Bus with driver \(driver)"
}
}
我收到“无法在属性初始值设定项内使用实例成员'驱动程序”;属性初始值设定项在'self'可用之前运行”的错误消息。据我了解,self
仍然不可用,因为还没有初始化所有的类成员。但是,当我将它放在init()
里面时,它可以工作。
class Bus {
private let driverList = ["A", "B", "C"]
private var driver: String = driverList.randomElement()!
@Published private var bus: String
init() {
self.bus = Bus.createBus(driver: driver)
}
static func createBus(driver: String) -> String {
return "Bus with driver \(driver)"
}
}
结果是,我想知道init()
的行为是否与lazy
类似,还是在self
可用后立即调用它,这很混乱,因为所有成员仍未初始化那么init()
如何访问self
。
编辑:我将数组移动到了类内部,并且我实际上拥有@Published的bus
属性,因为我想监视更改并在视图中进行更新。我发现拥有@Published使事情变得更加复杂。我道歉,因为我认为这是无关紧要的,所以没有首先提出。
答案 0 :(得分:0)
根据Swift documentation,init()
函数准备使用一个类/为其创建新实例。
从某种意义上说,该类在调用init()
之后才存在,这意味着在初始化该类之前,您无法访问变量driver
。由于init()
会初始化该类,因此它将创建您可以使用的self
。