Swift 如何处理';初始化前由闭包自动捕获';
假设我有一个如下的结构:Swift 如何处理';初始化前由闭包自动捕获';,swift,Swift,假设我有一个如下的结构: 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() { ready
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})
}
}
问题是,很自然地,我正在尝试使用self初始化回调,而self尚未初始化。
如何避免循环引用和相应的错误?最简单的方法是:
A类{
类ReadyHandler{
让回调:()->Void
init(回调:@escaping()->Void){self.callback=callback}
}
让readyHandler:readyHandler
var ready=false
init(){
var handlerBody={}
readyHandler=readyHandler{handlerBody()}
handlerBody={self.ready=true}
}
}
代码的问题在于您已经将变量声明为常量,swift应该始终在init方法中初始化常量。但是,这里有一种依赖的需求,readyHandler属性是一个常量,必须初始化它才能创建对象,但是,当您在其中使用未初始化的self时,您可以看到一个循环需求
如果使用optional或隐式unwrapped optional(在这种情况下,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
})
}()
}
您可以使用另一种方法进行处理程序初始化,并通过factory类创建实例