我是 Swift 和闭包的新手,并且正在寻求一些关于到底发生了什么的帮助。
示例 1:
func getData(completionHandler: ((NSArray?, NSError?) -> Void)?) -> Void {
那么函数getData
,有一个completion handler,其中NSArray
+ NSError
是传递给函数的可选参数?以下位 -> Void) 吗?
返回类型是否为 void,即没有设置要返回且整个闭包是可选的?
然后我不确定下面的 -> Void 是什么意思
在这种情况下?
示例 2:
let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in
... do something
}
在这种情况下,completionHandler
数据、响应和错误在 block 内分配给常量 task
。那是对的吗?我不确定 -> Void in
与 error
的关系,尤其是附加的 in
?
我花了一段时间查看各种代码,甚至自己编写了一些代码来熟悉语法,但很容易混淆,因为我发现了 http://fuckingclosuresyntax.com/
最佳答案
您对方法签名的看法是正确的。 -> Void)?
表示传入完成处理程序是可选的。 Void
表示该 block 不应返回供其调用者使用的值,这毫无意义。完成处理程序类型有一个闭包(匿名函数)类型,它正好接受 2 个参数:一个可选的 NSArray
类型和一个可选的 NSError
类型(所以要么/两者都可能为零)。它不会向调用者返回任何内容。
在你的第二个例子中,你实际上是在创建一个完成处理程序来传递给 dataTaskWithURL
方法,使用 data, response, error
作为参数(更多关于语法少量)。 -> Void
与之前相同,表明您的 block 不返回任何内容,尽管它位于 error
旁边。 in
只是用作编译器的分隔符,用于将闭包的参数与其主体分开。这种语法甚至有一点简写。我通常总是在 block 参数周围使用括号,但我想这取决于个人风格/品味/其他。因此,您的 completionHandler
定义也可能如下所示:
{ (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in // code, end with a }
现在发生了什么变得更清楚了。 Swift 做了很多推理,让你写得漂亮而紧凑,但如果你不熟悉代码,它可能会隐藏一些意义。这是定义一个闭包,它接受 3 个隐式展开的可选值作为参数:一个是 NSData!
类型,一个是 NSURLResponse!
,一个是 NSError!
。它不返回任何内容 (-> Void
)。闭包的主体,即无论你想做什么,都在 in
之后直到下一个 。因为该方法准确地定义了将要传递到 block 中的类型,所以在实现中,参数可以通过省略类型注释来简单地推断它们的类型,从而从
data: NSData!
到 just 数据
。同样在 Swift 中,省略闭包参数周围的括号是有效的,留下原始代码行。
关于swift - 解释 Swift Closure 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29321223/