我是Swift和闭包的新手,在得到一些关于到底发生了什么的帮助之后。
示例1:
func getData(completionHandler: ((NSArray?, NSError?) -> Void)?) -> Void {因此,函数getData有一个完成处理程序,其中NSArray + NSError是传递给函数的可选参数?以下位是返回类型为-> Void)?,即没有任何设置为返回,整个闭包是可选的吗?
然后,我不确定在本例中下面的-> Void meant是什么?
示例2:
let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in
... do something
}在这种情况下,completionHandler数据、响应和错误在块内分配给常量task。对吗?我不确定-> Void in与error的关系,特别是附加的in
我花了一段时间看看不同的代码,甚至自己写了一些代码来适应语法,但是当我发现http://fuckingclosuresyntax.com/时,很容易感到困惑。
发布于 2015-03-28 19:46:34
关于方法签名,您是正确的。-> Void)?意味着传入该完成处理程序(首先是可选的)。Void表示该块不应返回其调用方使用的值,这是不值得的。完成处理程序类型有一个闭包(匿名函数)类型,它恰好带有两个参数:一个是可选的NSArray类型,另一个是可选的NSError类型(因此两者都可能为零)。它什么也不回打电话的人。
在第二个示例中,您实际上正在创建一个完成处理程序,将其传递到dataTaskWithURL方法中,并将data, response, error作为参数(更多地介绍一下语法)。-> Void和以前一样,这表明您的块没有返回任何内容,尽管它位于error旁边。in只是用作编译器将闭包的参数与其正文分隔开的分隔符。这个语法甚至有一点人手不足。我通常在块参数周围使用括号,但我认为这取决于个人风格/品味/任何东西。因此,您的completionHandler定义也可以如下所示:
{ (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in // code, end with a }现在,事情变得更清楚了。Swift做了很多推断,并允许您编写漂亮而简洁的代码,但是如果您不熟悉代码,它可以隐藏一些含义。这定义了一个闭包,它接受3个隐式展开选项作为参数:一个是NSData!类型,一个是NSURLResponse!,另一个是NSError!。它不返回任何内容(-> Void)。闭包的主体,即您想做的任何事情,都是在in之后,直到下一个}。因为该方法确切地定义了要传递到块中的类型,所以在实现中,参数可以通过省略类型注释来推断它们的类型,从而从data: NSData!转到data。同样在Swift中,省略闭包参数周围的括号是有效的,这就留给了我们原来的代码行。
https://stackoverflow.com/questions/29321223
复制相似问题