2017-02-16 121 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() 

注意,「運行」時,纔會打印一次。

相關問題