2015-10-22 3 views
1

Может ли кто-нибудь сказать мне, почему в этом «странном» коде (мне весело с Swift; D) в ленивых функциях runEngine и stopEngine, метод печати никогда не выполняется? (пожалуйста, запустите этот код на детской площадке).Lazy function in Swift

Спасибо!

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

Код работает как и ожидалось для меня. enter image description here

Сначала мне показалось, что ленивый модификатор не нужен, но он есть. Когда экземпляр Engine создается, его делегат равен нулю, и это значение является тем, что зафиксировано закрытием. Использование ленивых отложенных, которые захватывают до его использования, которые к тому времени были установлены engine.delegate. Хотя мы могли бы как-то использовать @autoclosure, лучшим решением является просто сделать runEngine и stopEngine функциями.

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

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