考虑下面的代码:传递实例方法回调类初始化
class Bar {
let callback:() ->()
init(callback: @escaping() ->()) {
self.callback = callback
}
func event() {
self.callback()
}
}
class Foo {
let bar: Bar
init() {
self.bar = Bar(callback: self.handler)
}
func handler() {
print("Handled")
}
}
的基本想法是,我们希望每个Foo
有Bar
,其中,当event()
上调用Foo
的bar
,将调用Foo
的处理程序方法。但是,上述设置警告在Foo
的初始化之前,因为我们在所有实例属性初始化之前使用了self
。
我明白为什么这是一个错误:编译器不能保证该方法传递给Bar
小号初始化完成的初始化不会被前Foo
莫名其妙地称为'(例如Bar
可致电callback
PARAM就在它的初始值设定项或另一个线程可能会在Bar
的初始化程序返回之后但正好在结果分配给Foo
的bar
)之后调用event()
。
我的问题是,是否有一种方法来实现这种模式,我失踪了?一个解决办法是让bar
的IUO var
并将其分配给nil
只是打电话之前Bar
的init
--as只要我们知道回调也不会在不适当的时候被调用(或者只要我们不使用bar
在handler
)应该没有问题。但是,这对我来说很不好,我很乐意听到替代品,如果它们存在。
这实际上不是一个坏的解决方案,看起来干净了一点。另一种解决方案是在Bar上有'listenForEvents(callback:)'方法,并且回调是可选的(或IUO)。 – Jumhyn