Swift:将回调传递给结构体实例



我想按照下面的伪代码做一些事情:

struct Foo {
let BarInstance = Bar(Callback: CallBarInstance)
func CallBarInstance() -> Void {
BarInstance.FunctionToCall()
}
}
struct Bar {
var Callback: () -> Void
func FunctionToCall() -> Void {
print("Hello")
}
// More code that calls Callback
}

我收到无法将 (Foo(->((->Void 转换为 ((->Void 的错误。我想我理解这是因为 Foo 的实例被传入,因为它是一个成员函数。我认为它可以成为一个调用的静态函数,但访问成员变量感觉很麻烦 - 有没有一种好方法可以在 Swift 中获得我想要的功能?

你似乎试图在这里做一些危险的事情,而 Swift 阻止你这样做。

在这一行中:

let BarInstance = Bar(Callback: CallBarInstance)

您正在向Bar泄露未初始化的self。为什么?因为在调用Bar.init的时间点,Foo尚未完全初始化。也就是说,此时BarInstance的价值是什么?它是未定义的。然而,你却试图把self.CallbarInstance传递给Bar.init

想象一下,如果允许这样做会发生什么。Bar.init在返回之前直接调用了传入函数。现在我们有一个非常奇怪的情况:CallBarInstance实际上在实现中利用了BarInstance的价值,但是BarInstance的价值是什么?Bar.init还没有回来,所以它没有定义!

错误消息有点不清楚。在这种情况下,Swift 将CallBarInstance视为(Foo) -> () -> Void(就好像您将其称为Foo.CallBarInstance一样(,因为self不可用。

您可以通过先使用其他值初始化BarInstance,然后分配预期的Bar实例来修复它,但我不知道这是否会产生您的预期行为。

struct Foo {
var BarInstance = Bar(Callback: {})
init() {
BarInstance = Bar(Callback: CallBarInstance)
}
func CallBarInstance() -> Void {
BarInstance.FunctionToCall()
}
}

最新更新