Swift 函数语法分解

Swift Function Syntax Breakdown

我提前为这个问题的标题道歉。

我希望在 Swift.

中对函数的某些语法元素进行细分

函数:

let call:NSURLSessionDataTask = session.dataTaskWithRequest(request) {
    data, response, error in

    if error != nil {
        println("error=\(error)")
        return
    }

    println("response = \(response)")
}

我想知道的是逐行,元素如何影响常量?

我看到的;

1) 一个常量被设置为函数 (session.dataTaskWithR...) 的结果,带有 "request" 参数后跟似乎是闭包函数 { 的开始触发时执行。 (call.resume()

2) 这些是函数的声明变量吗?他们被分配到这里了吗?在函数顶部写 "data,response,error" 或 object 似乎很奇怪,我 assume/know 这些填充了从 session.dataTas.. 调用返回的数据。看起来好像它们未声明且未键入。

4) 这看起来很简单,如果错误不为零,打印错误并退出。

9) 打印响应 headers.

所以,我想我的主要问题是关于第 2 行的。我认为只写变量名没有任何意义,除了它是如何完成的。就是这样吗?

你用错了"closure"这个词。 Swift 中的所有函数都是闭包。这个函数的特别之处在于 anonymous。这意味着没有声明行——所以需要有另一种方式来表达传入的参数。 Swift 的解决方案是将参数列表(可能还有 return 类型)放在函数体开头的 in 行中。

Seems weird to just write "data,response,error" at the top of a function or object, I assume/know these are populated with data returned from the session.dataTas.. call. It just seems as though they are undeclared and not typed.

正确。它们 可以 显式输入,但它们不必在 this 情况下,因为编译器已经知道这些类型;它已经知道 session.dataTaskWithRequest: 的参数是什么(包括它作为第二个参数的函数的参数类型)。

查看文档,该方法的 Swift 签名是

func dataTaskWithRequest(request: NSURLRequest,
       completionHandler completionHandler: ((NSData!,
                                  NSURLResponse!,
                                  NSError!) -> Void)?) -> NSURLSessionDataTask

它有两个参数,NSURLRequest 和一个完成块。

Swift 有一种特殊情况的可选方法来处理调用最后一个参数是闭包的方法,称为“尾随闭包”。

您可以像往常一样将闭包作为括号内的参数传递,或者您可以跳过标签 (completionHandler) 并简单地在括号后添加闭包的大括号。

我不这么认为:

data, response, error in

是有效语法。

(data, response, error) -> () in

它告诉你闭包有 3 个输入参数和 returns void(什么都没有。)

编辑:

马特在他的评论中报告说这是合法的语法,尽管我仍然不明白如果没有参数周围的括号它是如何合法的。我正在等待澄清。

闭包接受一个 NSData、一个 NSURLResponse 和一个 NSURL,所有强制展开的可选值。

I see no meaning to just writing variable names other than, that's just how it is done. Is this just how it's done?

这是可以完成的一种方法。请参阅Swift 编程语言:

Closures 部分中的从上下文推断类型部分

将闭包作为内联闭包表达式传递给函数时,总是可以推断出参数类型和 return 类型。因此,当闭包用作函数参数时,您永远不需要以最完整的形式编写内联闭包。

因为方法声明是这样的:

func dataTaskWithRequest(_ request: NSURLRequest,
       completionHandler completionHandler: ((NSData!,
                                  NSURLResponse!,
                                  NSError!) -> Void)?) -> NSURLSessionDataTask

编译器可以推断出 dataresponseerror 参数的类型以及 return 类型。