【问题标题】:Lazy function in SwiftSwift 中的惰性函数
【发布时间】:2016-01-22 08:55:14
【问题描述】:

谁能告诉我为什么在惰性函数 runEngine 和 stopEngine 中的这个“奇怪”代码(我很喜欢 Swift ;D)中,打印方法永远不会执行? (请在操场上运行此代码)。

谢谢!

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()

【问题讨论】:

    标签: ios swift function delegates lazy-evaluation


    【解决方案1】:

    代码按我的预期运行。

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 2017-10-29
      • 2014-11-20
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多