首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释Swift闭包语法

解释Swift闭包语法
EN

Stack Overflow用户
提问于 2015-03-28 18:52:33
回答 1查看 570关注 0票数 2

我是Swift和闭包的新手,在得到一些关于到底发生了什么的帮助之后。

示例1:

代码语言:javascript
复制
func getData(completionHandler: ((NSArray?, NSError?) -> Void)?) -> Void {

因此,函数getData有一个完成处理程序,其中NSArray + NSError是传递给函数的可选参数?以下位是返回类型为-> Void)?,即没有任何设置为返回,整个闭包是可选的吗?

然后,我不确定在本例中下面的-> Void meant是什么?

示例2:

代码语言:javascript
复制
let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in
... do something
}

在这种情况下,completionHandler数据、响应和错误在块内分配给常量task。对吗?我不确定-> Void inerror的关系,特别是附加的in

我花了一段时间看看不同的代码,甚至自己写了一些代码来适应语法,但是当我发现http://fuckingclosuresyntax.com/时,很容易感到困惑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-28 19:46:34

关于方法签名,您是正确的。-> Void)?意味着传入该完成处理程序(首先是可选的)。Void表示该块不应返回其调用方使用的值,这是不值得的。完成处理程序类型有一个闭包(匿名函数)类型,它恰好带有两个参数:一个是可选的NSArray类型,另一个是可选的NSError类型(因此两者都可能为零)。它什么也不回打电话的人。

在第二个示例中,您实际上正在创建一个完成处理程序,将其传递到dataTaskWithURL方法中,并将data, response, error作为参数(更多地介绍一下语法)。-> Void和以前一样,这表明您的块没有返回任何内容,尽管它位于error旁边。in只是用作编译器将闭包的参数与其正文分隔开的分隔符。这个语法甚至有一点人手不足。我通常在块参数周围使用括号,但我认为这取决于个人风格/品味/任何东西。因此,您的completionHandler定义也可以如下所示:

代码语言:javascript
复制
{ (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in // code, end with a }

现在,事情变得更清楚了。Swift做了很多推断,并允许您编写漂亮而简洁的代码,但是如果您不熟悉代码,它可以隐藏一些含义。这定义了一个闭包,它接受3个隐式展开选项作为参数:一个是NSData!类型,一个是NSURLResponse!,另一个是NSError!。它不返回任何内容(-> Void)。闭包的主体,即您想做的任何事情,都是在in之后,直到下一个}。因为该方法确切地定义了要传递到块中的类型,所以在实现中,参数可以通过省略类型注释来推断它们的类型,从而从data: NSData!转到data。同样在Swift中,省略闭包参数周围的括号是有效的,这就留给了我们原来的代码行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29321223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档