首页 文章

解释Swift Closure语法

提问于
浏览
2

我是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 inerror 有关,尤其是 in

我花了一段时间来查看各种代码,甚至自己写一些来熟悉语法,但是很容易让我感到困惑,因为我发现了http://fuckingclosuresyntax.com/

1 回答

  • 4

    你对方法签名是正确的 . -> Void)? 表示传入的完成处理程序是可选的 . Void 表示该块不应返回其调用者使用的值,这是值得的 . 完成处理程序类型有一个闭包(匿名函数)类型,它只有两个参数:一个是可选的 NSArray 类型,另一个是可选的 NSError 类型(所以这两个中的任何一个都可能是nil) . 它不向调用者返回任何内容 .

    在第二个示例中,您实际上是在创建一个完成处理程序以传递到 dataTaskWithURL 方法,其中 data, response, error 作为参数(更多关于语法的内容) . -> Void 与之前相同,表示您的块没有返回任何内容,尽管它位于 error 的旁边 . in 只是用作编译器的分隔符,用于将闭包's arguments from its body. This syntax is even shorthanded a little bit. I always generally use parentheses around block arguments, but I suppose that'分隔为个人风格/品味/任何东西 . 所以您的 completionHandler 定义也可能如下所示:

    { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in // code, end with a }
    

    现在它变得更清楚了's going on. Swift does a lot of inference and allows you to write nice and compactly but it can hide some meaning if you'不熟悉代码 . 这是一个闭包,它接受3个隐式解包的选项作为参数: NSData! 类型之一, NSURLResponse! 之一, NSError! 之一 . 它什么都不返回( -> Void ) . 封闭的主体,即你想要做的任何东西,都在 in 之后,直到下一个 } . 因为该方法确切地定义了要传递到块中的类型,所以在实现中,参数可以通过省略类型注释来简单地推断它们的类型,从而从 data: NSData!data . 同样在Swift中,在闭包参数周围省略括号是有效的,让我们留下原始的代码行 .

相关问题