![](/img/trans.png)
[英]Using swift function with return value and completion block in Objective-C
[英]Using predefined function with parameters as completion block in swift
编辑:我认为问题是Swift语法,但问题是我不知道UIViewController.presentViewController为不带输入参数的完成处理程序指定了签名。
我必须为presentViewController提供一个完成处理程序。 我要提供的完成处理程序带有一个输入参数。 快速处理此问题的语法是什么?
如果处理程序未采用输入参数,则它将如下所示:
self.presentViewController(activityVC, animated: true, completion: myHandler)
但是,如果像这样声明myHandler,那么上面的行会是什么样子:
func myHandler(myParameter: AnyObject){
...
}
在问这个问题之前,我应该已经看过presentViewController的声明 ,但是我对闭包没有经验,并认为可以传递任何闭包。 事实证明,问题在于presentViewController采用了非常具体的形式关闭
(() -> Void)?
完整的签名在这里:
func presentViewController(_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion completion: (() -> Void)?)
因此,答案是presentViewController无法采用本身带有另一个参数的完成处理程序。
我相信您正在寻找以下方面:
function myHandler(myParameter: (() -> Void)) {
//code here
}
当然-> Void
会根据您是否想要该功能而变化
不幸的是,这行不通。 您不能只传递一个对完成块具有无效类型的函数。 它期望一个没有任何参数且没有返回类型/ void
的闭包。 您正在提供一个期望AnyObject
并且不返回/ void
的函数。 因此,预期的(() -> Void)
与提供的((AnyObject) -> Void)
之间不匹配
程序如何知道什么传递给myHandler
作为myParameter
?
我能想到的唯一方法是为自定义完成处理程序编写包装器:
self.presentViewController(activityVC, animated: true, completion:{self.myHandler("")})
您提供完成块调用这样myHandler
但实际上提供了价值myParameter
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.