我想按照下面的伪代码做一些事情:
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()
}
}