Ios Swift:将回调传递给结构实例
我想按照下面的伪代码做一些事情:Ios Swift:将回调传递给结构实例,ios,swift,Ios,Swift,我想按照下面的伪代码做一些事情: struct Foo { let BarInstance = Bar(Callback: CallBarInstance) func CallBarInstance() -> Void { BarInstance.FunctionToCall() } } struct Bar { var Callback: () -> Void func FunctionToCall() -> Void { print
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)
您正在将未初始化的self
泄漏到Bar
。为什么?因为在调用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()
}
}
你的解决方案确实有效,但我觉得我没有以正确的方式快速完成。谢谢你的帮助