swift - 将其设置为变量时是否执行闭包?

标签 swift

我正在为我们的 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,一次使用。

enter image description here

如果是这种情况,我会执行两次网络调用,这显然不是我有意的。

闭包会在我设置和调用它时触发,还是只是 XCode playground 的错误?

最佳答案

不,它没有按照你设置的那样执行。

与 Playgrounds 显示其结果的方式不同,这并不是 Playgrounds 的具体错误。 (不是闭包)被执行了两次。一次通过赋值,一次在执行闭包时。

您可以按如下方式证明这一点:

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

test()

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

关于swift - 将其设置为变量时是否执行闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42282088/

相关文章:

ios - 如何获取自动续订订阅的到期日期

ios - 为自定义 View 不工作的 UIBarButtonItem 添加目标

swift - 如何在 swift 中使用 contains in dict

ios - 如何更改 TableView 中的标签文本颜色(数据存储在数组中)

swift - 强制解包返回类型?

ios - 使用 iOS 中的照片框架将视频保存到自定义相册

ios - 在 Swift 中子类化 View Controller

ios - 在类的每个函数中调用相同的代码

ios - swift 中的 Facebook native 共享对话框

Swift:addGestureRecognizer 在类里面不起作用