我在这里有一个关于这个闭包的快速概念性问题:
func getRandomUser(onCompletion: (JSON) -> Void) {
let route = baseURL
makeHTTPGetRequest(route, onCompletion: { json, err in
onCompletion(json)
})
}
onCompletion(json)行究竟做了什么?这是对onCompletion的递归调用吗?
答案 0 :(得分:2)
让我们逐行查看您的功能:
1. func getRandomUser(onCompletion: (JSON) -> Void) {
2. let route = baseURL
3. makeHTTPGetRequest(route, onCompletion: { json, err in
4. onCompletion(json)
5. })
6. }
第1行:这会给出你的功能的签名;它需要一个参数,并且该参数的类型为(JSON) -> Void
,这意味着它接受的参数是一个闭包,它本身接受一个JSON
类型的参数并且没有返回值,即&#34 ;返回Void",-> Void
或-> ()
;请注意,函数定义还包含该参数的本地参数名称:在函数体内,该闭包被赋值给常量onCompletion
第2行:不断分配......
第3行:这会调用函数makeHTTPGetRequest(_:onCompletion:)
,它接受两个参数:一个路由(在调用中不使用外部标签,因此_
在前面给出的函数名称)和一个闭包 - 这个闭包的类型为(JSON, NSError?) -> Void
;请注意,在onCompletion
出现的这一行上,这是调用makeHTTPGetRequest(_:onCompletion:)
函数时第二个参数所需的外部标签,没有任何分配发生(如第1行< /强>)
第4行:使用一个参数调用分配给常量onCompletion
的闭包...
因此,虽然文本onCompletion
在此代码段中出现两次(在第4行实际调用闭包之前)可能会令人困惑,但只有一个常量以该名称出现 - 另一个出现只是参数的外部标签。
如果它有帮助,我们实际上可以通过利用Swift的"trailing closure syntax"完全取消onCompletion
标签的使用,并像这样重写它:
func getRandomUser(onCompletion: (JSON) -> Void) {
let route = baseURL
makeHTTPGetRequest(route) { json, err in onCompletion(json) }
}
...但这是另一篇帖子的话题:)
答案 1 :(得分:1)
onCompletion
的{{1}}参数在其自己的范围内不可用。它基本上宣告makeHTTPGetRequest
是什么。然后,它会在onCompletion
上调用onCompletion
。