【问题标题】:Is a closure executed when setting it to a variable?将其设置为变量时是否执行了闭包?
【发布时间】:2017-02-16 18:37:34
【问题描述】:

我正在为我们的 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 游乐场错误?

【问题讨论】:

    标签: swift


    【解决方案1】:

    不,它不会按照您的设置执行。

    这并不是 Playgrounds 的错误,而是 Playgrounds 显示结果的方式。 line (不是闭包)被执行了两次。一次赋值,一次执行闭包。

    您可以如下演示:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多