2017-05-09 57 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 } 
    } 
} 
相关问题