2016-12-02 100 views
1

我一直在遷移我的項目到swift3並一直在爭取讓Alamofire RequestRetrier協議工作。我按照Alamofire 4.0遷移指南: https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#request-retrier類不符合協議RequestRetrier

這是我想打造類:

import Foundation 
import Alamofire 

class RequestAccessTokenAdapter: RequestAdapter, RequestRetrier { 
    private let accessToken: String 

    init(accessToken: String) { 
     self.accessToken = accessToken 
    } 

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest { 
     var urlRequest = urlRequest 

     if (urlRequest.url?.absoluteString.hasPrefix(MyServer.serverUrl()))! { 
      urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization") 
     } 

     return urlRequest 
    } 

    func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) { 
     if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 { 
      completion(true, 1.0) // retry after 1 second 
     } else { 
      completion(false, 0.0) // don't retry 
     } 
    } 

} 

大廈失敗,出現以下錯誤:類型「RequestAccessTokenAdapter」不符合協議「 RequestRetrier」

我一直在試圖與這兩個Alamofire 4.2.0 & AlamofireObjectMapper 4.0.1,並與Alamofire 4.0.1 & AlamofireObjectMapper 4.0.0,但我一直GET同樣的錯誤。

如果我只使用RequestAdapter協議並刪除should-function,那麼一切都會建立好,但我似乎無法獲得構建的RequestRetrier,這對我的項目也是需要的。

任何想法,我從我的課缺少什麼?

編輯:

我似乎有一個命名空間的問題,因爲代碼構建成功我應該函數的定義替換錯誤與Swift.Error後:

func should(_ manager: SessionManager, retry request: Request, with error: Swift.Error, completion: @escaping RequestRetryCompletion) { 

回答

3

我也被看到同樣的問題。看完Alamofire源代碼後,我發現XCode爲should方法自動生成無效的方法簽名。通過明確地將Alamofire模塊名稱添加到SessionManager,RequestRequestRetryCompletion類型聲明中,在should方法的參數列表中,我終於能夠獲得它。所以,你should方法應該是這個樣子:

func should(_ manager:  Alamofire.SessionManager, 
      retry request: Alamofire.Request, 
      with error:  Error, 
      completion:  @escaping Alamofire.RequestRetryCompletion) { 

    // Do something 

} 

我希望這有助於!

+1

謝謝你的回答。它部分幫助我解決了我的問題。我可能會遇到某種名稱空間衝突,但是當我將Swift.Error替換爲Error時,我的代碼生成成功了。 – liitokone

相關問題