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

时间:2017-02-16 18:37:35

标签: 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操场错误?

1 个答案:

答案 0 :(得分:2)

不,它不会在您设置时执行。

它并不是Playgrounds错误,而是Playgrounds显示结果的结果。 (不是闭包)执行两次。一旦通过赋值,一次执行闭包。

您可以按如下方式证明:

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

test()

请注意&#34;运行&#34;只打印一次。