使用Swift Closure。递归?

时间:2015-06-27 01:04:14

标签: swift closures

我在这里有一个关于这个闭包的快速概念性问题:

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

    let route = baseURL

    makeHTTPGetRequest(route, onCompletion: { json, err in

        onCompletion(json)

    })

}

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

2 个答案:

答案 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