Swift函数语法细分

时间:2015-05-28 18:50:48

标签: swift syntax

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

我希望在Swift中对函数的某些语法元素进行细分。

功能:

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

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

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

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

我所看到的;

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

2)这些声明的变量是否为函数?他们被分配到这里了吗?在函数或对象的顶部写“数据,响应,错误”似乎很奇怪,我假设/知道这些是用session.dataTas..调用返回的数据填充的。看起来好像他们是未申报的而且没有打字。

4)这似乎很简单,如果错误不是nil,则打印错误并退出。

9)打印响应标题。

所以,我猜我的主要问题是关于第2行。我认为除了编写变量名之外没有任何意义,这就是它的完成方式。这是怎么做的?

3 个答案:

答案 0 :(得分:3)

你使用“关闭”这个词错了。所有函数都是Swift中的闭包。使这个功能与众不同的是匿名。这意味着没有声明行 - 因此需要另一种表达传入参数的方法。 Swift的解决方案是将参数列表(可能还有返回类型)放在函数体开头的in行中。

  

在函数或对象的顶部只写“数据,响应,错误”似乎很奇怪,我假设/知道这些是用session.dataTas ..调用返回的数据填充的。它看起来好像是未申报的而且没有打字。

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

答案 1 :(得分:1)

  

我认为只编写变量名称没有任何意义,这就是它的完成方式。这是怎么做的?

这是可以完成的一种方式。请参阅 Swift编程语言Closures部分中的从上下文中推断类型部分:

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

因为方法声明如下所示:

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

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

答案 2 :(得分:0)

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

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

需要2个参数,NSURLRequest和完成块。

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

您可以将闭包作为参数传递给括号中的正常参数,或者您可以跳过标签(completionHandler)并在parens之后添加闭包的大括号。

我不这么认为:

data, response, error in

是有效的语法。

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

它告诉你闭包需要3个输入参数并返回void(没有。)

编辑:

Matt在他的评论中报告说它是合法的语法,虽然我仍然不明白如果没有围绕参数的括号,它是如何合法的。我有兴趣等待澄清。

闭包采用NSData,NSURLResponse和NSURL,所有强制解包的选项。