首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Swift闭包。递归的?

使用Swift闭包。递归的?
EN

Stack Overflow用户
提问于 2015-06-27 01:04:14
回答 1查看 327关注 0票数 1

关于这个结论,我有一个简单的概念问题:

代码语言:javascript
复制
func getRandomUser(onCompletion: (JSON) -> Void) {

    let route = baseURL

    makeHTTPGetRequest(route, onCompletion: { json, err in

        onCompletion(json)

    })

}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-27 04:29:14

让我们逐行查看您的函数:

代码语言:javascript
复制
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的“尾尾闭包语法”并将其重写如下:

代码语言:javascript
复制
func getRandomUser(onCompletion: (JSON) -> Void) {
    let route = baseURL
    makeHTTPGetRequest(route) { json, err in onCompletion(json) }
}

...but,这是另一篇文章的主题:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31084118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档