Swift中的懒惰函数

时间:2015-10-22 22:31:26

标签: ios swift function delegates lazy-evaluation

有谁可以告诉我为什么在这个'奇怪的'代码(我和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()

1 个答案:

答案 0 :(得分:0)

代码按预期运行。 enter image description here

起初我认为懒惰的修饰符是不必要的,但确实如此。当Engine被实例化时,它的委托是nil,并且该值是闭包捕获的值。使用lazy延迟捕获,直到它的使用,当时engine.delegate已被设置。虽然我们可能会以某种方式使用@autoclosure,但最好的解决方案是只提供runEnginestopEngine功能。

  func runEngine() {
    print("Engine has been started")
    delegate?.engineDidStart()
  }

  func stopEngine() {
    print("Engine has been stoped")
    delegate?.engineDidStop()
  }