我提前为这个问题的标题道歉。
我希望在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行。我认为除了编写变量名之外没有任何意义,这就是它的完成方式。这是怎么做的?
答案 0 :(得分:3)
你使用“关闭”这个词错了。所有函数都是Swift中的闭包。使这个功能与众不同的是匿名。这意味着没有声明行 - 因此需要另一种表达传入参数的方法。 Swift的解决方案是将参数列表(可能还有返回类型)放在函数体开头的in
行中。
在函数或对象的顶部只写“数据,响应,错误”似乎很奇怪,我假设/知道这些是用session.dataTas ..调用返回的数据填充的。它看起来好像是未申报的而且没有打字。
正确。它们可以 显式输入,但它们不必在这个的情况下,因为编译器已经知道这些类型;它已经知道session.dataTaskWithRequest:
的参数是什么(包括它作为第二个参数所使用的函数的参数类型)。
答案 1 :(得分:1)
我认为只编写变量名称没有任何意义,这就是它的完成方式。这是怎么做的?
这是可以完成的一种方式。请参阅 Swift编程语言的Closures部分中的从上下文中推断类型部分:
在将闭包作为内联闭包表达式传递给函数时,始终可以推断出参数类型和返回类型。因此,当闭包用作函数参数时,您永远不需要以最完整的形式编写内联闭包。
因为方法声明如下所示:
func dataTaskWithRequest(_ request: NSURLRequest,
completionHandler completionHandler: ((NSData!,
NSURLResponse!,
NSError!) -> Void)?) -> NSURLSessionDataTask
编译器可以推断出data
,response
和error
参数的类型以及返回类型。
答案 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,所有强制解包的选项。