为什么在使用闭包创建 属性 时不允许使用 self?
Why is it not allowed to use self when creating a property using closure?
// Design Protocol
protocol SendDataDelegate {}
// Design Sender/Delegator
class SendingVC {
var delegate: SendDataDelegate?
deinit {
print("Delegator gone")
}
}
// Design Receiver/Delegate
class ReceivingVC: SendDataDelegate {
lazy var sendingVC: SendingVC = { // if i don't use lazy, i am not allowed to use self within the closure.
let vc = SendingVC()
vc.delegate = self // here
return vc
}()
deinit {
print("Delegate gone")
}
}
这背后的原因是什么?
根据我在网上找到的内容:由于对象未初始化,因此 self 不可用,这甚至意味着什么?
字面意思。
如果你不说 lazy
,那么你正在尝试用你的等号 (=
) 初始化 sendingVC
,一个实例 属性 的 ReceivingVC,同时正在初始化 ReceivingVC 实例本身 (self
)。在它自己的初始化过程中提到 self
是循环的,所以它是被禁止的。
通过说 lazy
,您是在说:不要初始化 sendingVC
直到某个时间 在 ReceivingVC 实例(self
) 已经初始化——也就是说,当一些其他代码引用它时。这解决了问题,现在允许提及 self
。
// Design Protocol
protocol SendDataDelegate {}
// Design Sender/Delegator
class SendingVC {
var delegate: SendDataDelegate?
deinit {
print("Delegator gone")
}
}
// Design Receiver/Delegate
class ReceivingVC: SendDataDelegate {
lazy var sendingVC: SendingVC = { // if i don't use lazy, i am not allowed to use self within the closure.
let vc = SendingVC()
vc.delegate = self // here
return vc
}()
deinit {
print("Delegate gone")
}
}
这背后的原因是什么? 根据我在网上找到的内容:由于对象未初始化,因此 self 不可用,这甚至意味着什么?
字面意思。
如果你不说
lazy
,那么你正在尝试用你的等号 (=
) 初始化sendingVC
,一个实例 属性 的 ReceivingVC,同时正在初始化 ReceivingVC 实例本身 (self
)。在它自己的初始化过程中提到self
是循环的,所以它是被禁止的。通过说
lazy
,您是在说:不要初始化sendingVC
直到某个时间 在 ReceivingVC 实例(self
) 已经初始化——也就是说,当一些其他代码引用它时。这解决了问题,现在允许提及self
。