2017-05-09 61 views
2

說我有一個結構如下:如何應對自我初始化之前關閉捕捉「

class A { 
    class ReadyHandler { // fires off the callback when needed 
    let callback; 
    init(callback:()->Void) { 
     self.callback = callback 
    } 
    } 
    let readyHandler: ReadyHandler 
    let ready = false 
    init() { 
    readyHandler = ReadyHandler(callback: {self.ready = true}) 
    } 
} 

的問題是,當然,我正在嘗試使用自助初始化的回調,這尚未初始化。 如何避免循環參考和相應錯誤?

+0

您可以使用其他方法處理程序初始化並通過工廠類創建實例 –

回答

1

與您的代碼的問題是,你聲明的變量作爲一個常量,迅速應該總是init方法中初始化的常量。但是,在這裏你有相關的需求類型,readyHandler屬性是一個常量,它必須被初始化以創建對象,然後,你在自己內部使用未初始化的自己,你可以看到一個循環需求。

你可以直接擺脫這個,如果你使用可選或隱式解包的可選方案,在這種情況下,swift在實例化階段不需要初始值。

class A { 
    class ReadyHandler { // fires off the callback when needed 
    let callback:()->Void 
    init(callback: @escaping()->Void) { 
     self.callback = callback 
    } 
    } 
    var readyHandler: ReadyHandler! 
    var ready = false 

    init() { 
    readyHandler = ReadyHandler(callback: {self.ready = true}) 
    } 
} 

您可以創建一個也用懶屬性您爲readyHandler其被初始化它被用於第一次。

class A { 
    class ReadyHandler { 

    let callback:()->Void 

    init(callback: @escaping()->Void) { 
     self.callback = callback 
    } 

    } 

    var ready = false 

    lazy var readyHandler: ReadyHandler = { 
    return ReadyHandler(callback: { [unowned self] in 
     self.ready = true 
    }) 
    }() 
} 
1

你可以像這樣走最簡單的方法:

class A { 
    class ReadyHandler { 
     let callback:() -> Void 
     init(callback: @escaping() -> Void) { self.callback = callback } 
    } 

    let readyHandler: ReadyHandler 
    var ready = false 

    init() { 
     var handlerBody = {} 
     readyHandler = ReadyHandler { handlerBody() } 
     handlerBody = { self.ready = true } 
    } 
} 
相關問題