2017-02-16 102 views
0

我正在为我们的API做封装。这个想法是将所有路由定义为枚举,并将对象返回到任何被调用的地方。设置为变量时是否执行了一个闭包?

这种模式的一个例子:

//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操作bug?

回答

2

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

与Playgrounds显示其结果的结果相比,它不是特别的游乐场错误。 (不是关闭)被执行两次。一旦通过赋值,一次执行闭包。

可以证明这一点,如下所示:

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

test() 

注意,“运行”时,才会打印一次。

相关问题