swift - 解释 Swift Closure 语法

标签 swift closures

我是 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 inerror 的关系,尤其是附加的 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/

相关文章:

javascript - 使用闭包

forEach 中的 JavaScript 三元运算符返回未定义

ios - 从 DeviceActivityEvent 快速获取应用程序

ios - 无法调用非函数类型的值 'NSDictionary'

swift - 从父类(super class)数组中过滤掉子类

clojure - 这是关闭吗?如果是这样,为什么?

javascript - 如果 goog.require 是基类导入的,那么它是否需要在子类中重复

ios - 如何删除 SQLite swift 4 中的 TableView 行

ios - 如何解析Firebase实时数据库

javascript - jquery animate 回调直到最终循环才执行