有谁可以告诉我为什么在这个'奇怪的'代码(我和Swift一起玩; D)在惰性函数runEngine和stopEngine中,print方法永远不会被执行? (请在游乐场中运行此代码。)
谢谢!
protocol EngineDelegate {
func engineDidStart()
func engineDidStop()
}
class Engine {
var delegate: EngineDelegate?
lazy var runEngine : () -> () = {
print("Engine has been started")
self.delegate?.engineDidStart()
}
lazy var stopEngine : () -> () = {
print("Engine has been stoped")
self.delegate?.engineDidStop()
}
}
class Car: EngineDelegate {
let engine = Engine()
init() {
engine.delegate = self
}
func engineDidStop() {
print("MyOwnStop")
}
func engineDidStart() {
print("MyOwnStart")
}
}
let car = Car()
car.engine.runEngine()
答案 0 :(得分:0)
起初我认为懒惰的修饰符是不必要的,但确实如此。当Engine被实例化时,它的委托是nil,并且该值是闭包捕获的值。使用lazy延迟捕获,直到它的使用,当时engine.delegate已被设置。虽然我们可能会以某种方式使用@autoclosure
,但最好的解决方案是只提供runEngine
和stopEngine
功能。
func runEngine() {
print("Engine has been started")
delegate?.engineDidStart()
}
func stopEngine() {
print("Engine has been stoped")
delegate?.engineDidStop()
}