使用 Swift 闭包。递归?

Using Swift Closure. Recursive?

我只是有一个关于此闭包的快速概念性问题:

func getRandomUser(onCompletion: (JSON) -> Void) {

    let route = baseURL

    makeHTTPGetRequest(route, onCompletion: { json, err in

        onCompletion(json)

    })

}

onCompletion(json) 这行到底做了什么?这是对 onCompletion 的递归调用吗?

makeHTTPGetRequestonCompletion 参数在其自身范围内不可用。它基本上是在声明 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 :)