说我的结构如下:
Language version
问题在于,我正在尝试使用self进行初始化回调,该回调尚未初始化。 如何避免循环引用和相应的错误?
答案 0 :(得分: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 }
}
}
答案 1 :(得分:1)
您的代码的问题是您已将变量声明为常量,并且swift应始终在init方法中初始化常量。但是,在这里你有依赖类型的要求,readyHandler属性是一个常量,必须初始化才能创建对象,但是,你在其中使用self并未初始化,你可以看到循环要求。
你可以直接摆脱这个,如果你使用可选或隐式解包的可选,在这种情况下,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创建一个也使用lazy属性,该属性在第一次使用时被初始化。
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
})
}()
}