我正在为我们的 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 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/