关于这个结论,我有一个简单的概念问题:
func getRandomUser(onCompletion: (JSON) -> Void) {
let route = baseURL
makeHTTPGetRequest(route, onCompletion: { json, err in
onCompletion(json)
})
}onCompletion(json)到底是做什么的?这是对onCompletion的递归调用吗?
发布于 2015-06-27 04:29:14
让我们逐行查看您的函数:
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类型的参数,并且没有返回值,即“返回无效”、-> Void或-> ();注意,函数定义还包括该参数的本地参数名称:在函数体中,该闭包被分配给常量onCompletion。
第2行:常数赋值..。
第3行:它调用函数makeHTTPGetRequest(_:onCompletion:),它使用两个参数:路由(在调用中不使用外部标签,因此函数名为_ )和闭包--这个闭包是(JSON, NSError?) -> Void类型的;请注意,在发生onCompletion的这一行中,这是调用makeHTTPGetRequest(_:onCompletion:)函数时第二个参数所需的外部标签,没有发生任何赋值(就像在第1行上发生的那样)。
第4行:分配给常量onCompletion的闭包是用一个参数调用的.
因此,虽然在这一段代码中(在第4行实际调用闭包之前)文本onCompletion可能会出现两次,但只有一个常量是该名称--另一个事件只是一个参数的外部标签。
如果这有帮助的话,我们实际上可以完全消除onCompletion标签的使用,方法是利用Swift的“尾尾闭包语法”并将其重写如下:
func getRandomUser(onCompletion: (JSON) -> Void) {
let route = baseURL
makeHTTPGetRequest(route) { json, err in onCompletion(json) }
}...but,这是另一篇文章的主题:)
https://stackoverflow.com/questions/31084118
复制相似问题