Swift中的惰性函数

3

请问有人能告诉我为什么在这段“奇怪”的代码中(我正在用Swift玩耍;D),在runEngine和stopEngine的lazy函数中,print方法从未被执行?(请在playground中运行此代码。)

谢谢!

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()
1个回答

1

代码在我的机器上按预期运行。 输入图像描述

起初我认为懒惰修饰符是不必要的,但实际上是需要的。当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()
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接