使用 Swift 闭包。递归?
Using Swift Closure. Recursive?
我只是有一个关于此闭包的快速概念性问题:
func getRandomUser(onCompletion: (JSON) -> Void) {
let route = baseURL
makeHTTPGetRequest(route, onCompletion: { json, err in
onCompletion(json)
})
}
onCompletion(json) 这行到底做了什么?这是对 onCompletion 的递归调用吗?
makeHTTPGetRequest
的 onCompletion
参数在其自身范围内不可用。它基本上是在声明 onCompletion
是什么。然后它将在 getRandomUser
.
上调用 onCompletion
让我们逐行查看您的函数:
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
类型的参数并且没有 return 值,即 "returns Void"、-> Void
或 -> ()
;请注意,函数定义还包括该参数的局部参数名称:在函数体内,该闭包被分配给常量 onCompletion
第 2 行:常量赋值...
第 3 行:这调用函数 makeHTTPGetRequest(_:onCompletion:)
,它有两个参数:一个路由(在调用中不使用外部标签,因此 _
在前面给出的函数名中)和一个闭包——这个闭包的类型是 (JSON, NSError?) -> Void
;请注意,在 onCompletion
出现的这一行,这是调用 makeHTTPGetRequest(_:onCompletion:)
函数时第二个参数所需的外部标签,没有发生任何赋值(如 行1)
第 4 行:使用一个参数调用分配给常量 onCompletion
的闭包...
因此,虽然文本 onCompletion
在这部分代码中出现了两次(在第 4 行实际调用闭包之前)可能会造成混淆,但只有一个常量使用该名称 -其他事件只是参数的外部标签。
如果有帮助,我们实际上可以完全消除使用 onCompletion
标签,方法是利用 Swift 的 "trailing closure syntax" 并像这样重写它:
func getRandomUser(onCompletion: (JSON) -> Void) {
let route = baseURL
makeHTTPGetRequest(route) { json, err in onCompletion(json) }
}
...但这是另一个话题 post :)
我只是有一个关于此闭包的快速概念性问题:
func getRandomUser(onCompletion: (JSON) -> Void) {
let route = baseURL
makeHTTPGetRequest(route, onCompletion: { json, err in
onCompletion(json)
})
}
onCompletion(json) 这行到底做了什么?这是对 onCompletion 的递归调用吗?
makeHTTPGetRequest
的 onCompletion
参数在其自身范围内不可用。它基本上是在声明 onCompletion
是什么。然后它将在 getRandomUser
.
onCompletion
让我们逐行查看您的函数:
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
类型的参数并且没有 return 值,即 "returns Void"、-> Void
或 -> ()
;请注意,函数定义还包括该参数的局部参数名称:在函数体内,该闭包被分配给常量 onCompletion
第 2 行:常量赋值...
第 3 行:这调用函数 makeHTTPGetRequest(_:onCompletion:)
,它有两个参数:一个路由(在调用中不使用外部标签,因此 _
在前面给出的函数名中)和一个闭包——这个闭包的类型是 (JSON, NSError?) -> Void
;请注意,在 onCompletion
出现的这一行,这是调用 makeHTTPGetRequest(_:onCompletion:)
函数时第二个参数所需的外部标签,没有发生任何赋值(如 行1)
第 4 行:使用一个参数调用分配给常量 onCompletion
的闭包...
因此,虽然文本 onCompletion
在这部分代码中出现了两次(在第 4 行实际调用闭包之前)可能会造成混淆,但只有一个常量使用该名称 -其他事件只是参数的外部标签。
如果有帮助,我们实际上可以完全消除使用 onCompletion
标签,方法是利用 Swift 的 "trailing closure syntax" 并像这样重写它:
func getRandomUser(onCompletion: (JSON) -> Void) {
let route = baseURL
makeHTTPGetRequest(route) { json, err in onCompletion(json) }
}
...但这是另一个话题 post :)