在swift中使用带参数的预定义函数作为完成块

时间:2015-06-28 15:05:47

标签: ios swift closures

编辑:我认为问题是Swift语法,但问题是我不知道UIViewController.presentViewController为完整处理程序指定了一个没有输入参数的签名。

我必须为presentViewController提供一个完成处理程序。我想提供的完成处理程序采用输入参数。在swift中处理这个的语法是什么?

如果处理程序没有输入参数,它将如下所示:

self.presentViewController(activityVC, animated: true, completion: myHandler)

但是如果myHandler声明如下,上面的行怎么看:

func myHandler(myParameter: AnyObject){
    ...
}

3 个答案:

答案 0 :(得分:1)

在问这个问题之前我应该​​看一下declaration of presentViewController,但我对闭包没有经验,并认为任何关闭都可以通过。事实证明,问题是presentViewController采用了一种非常具体的形式闭包

(() -> Void)?

完整的签名在这里:

func presentViewController(_ viewControllerToPresent: UIViewController,
              animated flag: Bool,
            completion completion: (() -> Void)?)

所以答案是presentViewController不能接受一个本身需要另一个参数的完成处理程序。

答案 1 :(得分:0)

我相信您希望执行以下操作:

function myHandler(myParameter: (() -> Void)) {
//code here
}

当然-> Void会根据您是否需要该功能而改变

答案 2 :(得分:0)

不幸的是,这不起作用。您不能只传入一个完成块类型无效的函数。它期望一个没有任何参数的闭包,并且没有返回类型/ void。您提供的函数需要AnyObject并且不返回任何/ void。因此,预期(() -> Void)与提供的((AnyObject) -> Void)

之间存在不匹配

该程序如何知道将myHandler传递给myParameter的内容?

我能想到的唯一方法就是为自定义完成处理程序编写一个包装器:

self.presentViewController(activityVC, animated: true, completion:{self.myHandler("")})

这样您就可以提供一个调用myHandler的完成块,但实际上会为myParameter提供一个值。