Moya と Object Mapper に基づいて、一般的なリクエスト ハンドラー クラスを作成しようとしています。基本的に、Moya ターゲットへのリクエストを実行し、成功と失敗の両方のケースでいくつかの基本的な処理を実行するメソッドが必要です。
私のクラスは、この答えに基づいて次のようになります:
class APIRequestHandler<T: Mappable> {
let provider = APIManager().getAPIProvider() // Moya provider
func performRequest(target: Target, completionHandler: (response: T?, error: StoreError?) -> Void) {
provider.request(target) { result in
switch result {
case let .Success(response):
switch response.statusCode {
case 200..<300:
do {
let json = try NSJSONSerialization.JSONObjectWithData(response.data, options: .MutableContainers)
let contractualDocument = Mapper<T>().map(json)
completionHandler(response: contractualDocument!, error: nil)
} catch _ {
// Unexpected error when the response can't be parsed
completionHandler(response: nil, error: StoreError.UnexpectedError)
}
case 500:
completionHandler(response: nil, error: StoreError.ServerError)
default:
completionHandler(response: nil, error: StoreError.HTTPError(statusCode: response.statusCode))
}
case .Failure(_):
completionHandler(response: nil, error: StoreError.NetworkError)
}
}
}
}
私の質問は、クラス レベルではなく関数レベルでジェネリックを使用して同じ結果を得ることができるかどうかです。
func performRequest<T: Mappable>(target: Target, completionHandler: (response: T?, error: StoreError?) -> Void) {
provider.request(target) { result in
switch result {
case let .Success(response):
// blah, blah
case .Failure(_):
// bleh, bleh
}
}
}
私はそれを試してみましたが、コードでビルドエラーが発生しました:
Generic parameter "T" could not be inferred