Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:将回调传递给结构实例_Ios_Swift - Fatal编程技术网

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()
  }
}

你的解决方案确实有效,但我觉得我没有以正确的方式快速完成。谢谢你的帮助