2016-12-02 6 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の両方にしようとしているとも4.0.0 AlamofireObjectMapper Alamofire 4.0.1 &と私は保つ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メソッドの無効なメソッドシグネチャを自動生成していることを発見しました。 モジュール名をSessionManager,RequestおよびRequestRetryCompletion型宣言に明示的に追加することによって、shouldメソッドの引数リストに、これを最終的に構築することができました。私はこれが役に立てば幸い

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

    // Do something 

} 

:だから、あなたのshould方法は次のようになります!

+1

ありがとうございました。私の問題を部分的に解決するのに役立ちました。私は名前空間の衝突のようなものがあるかもしれませんが、Swift.ErrorをErrorに置き換えたとき、私のコードは成功しました。 – liitokone

関連する問題