繁体   English   中英

设置为变量时是否执行闭包?

[英]Is a closure executed when setting it to a variable?

我正在为我们的API包装。 这个想法是将所有路由定义为枚举,并将Alamofire DataResponse对象返回到调用它的任何地方。

此模式的一个示例:

//MARK: PUT requests
@discardableResult
static func put(_ route: API.Route.put) -> DataRequest {
    var request: () -> DataRequest
    switch route {
    case .location(let location):
        let params = ["lat":location.coordinate.latitude, "long":location.coordinate.longitude]
        let url = baseUrl + endpoint(for: route)
        request = { Alamofire.request(url, method: .put, parameters: params) } //<< Is this block executed as I set it? 
    }

    return request().responseJSON(completionHandler: { request in log(request)})
}

因为我想在返回请求之前执行一些日志记录,所以我想让请求保持关闭状态,以返回请求,直到我返回请求才开始。 我的想法是,作为变量传递的请求关闭将不会执行。

但是,当我在Playground中运行类似功能时,它似乎执行了两次。 一次将其设置为request ,一次使用时。

在此处输入图片说明

如果是这种情况,我将执行两次网络调用,这显然不是我想要的。

在设置闭包时以及在调用它时会触发该闭包,还是仅是XCode操场上的bug?

不,它不会像您设置的那样执行。

这并不是Playgrounds的错误,而是Playgrounds如何显示其结果的结果。 (不是闭包)执行两次。 一次通过赋值,一次在执行关闭时。

您可以演示如下:

func test() -> Int {
    let request: () -> Int
    request =
        { print("run"); return 10 }
    return request()
}

test()

请注意,“运行”仅打印一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM