Как исправить ошибку Alamofire 5: «Не удается специализировать неуниверсальный тип« DataResponseSerializer »»? - PullRequest
0 голосов
/ 04 июня 2019

Я обновляю Network Foundation до Swift (и Alamofire) версии 5.

Один метод, который должен обеспечить «Сериализацию универсального объекта ответа», - выдавать ошибку

Невозможно специализировать неуниверсальный тип 'DataResponseSerializer'

Я думаю, что в Alamofire 5 они сделали Type DataResponseSerializer неуниверсальным. Есть идеи, как добиться такого же поведения в новейшей версии? К сожалению, я не очень знаком ни с Alamofire, ни с Generics.

public extension Alamofire.DataRequest {

  @discardableResult
  func responseDecodableObject<T: Decodable>(completionHandler: @escaping (DataResponse<T>) -> Void) -> Self {

    //error is thrown here
    let responseSerializer = DataResponseSerializer<T> { request, response, data, error in

        guard error == nil else { return .failure(error!) }

        let result = DataRequest.jsonResponseSerializer(options: .allowFragments).serializeResponse(request, response, data, error)

        switch result {
        case .success(let value):
            do {
               let data = try JSONSerialization.data(withJSONObject: value, options: .prettyPrinted)
               return .success(try JSONDecoder().decode(T.self, from: data))
            } catch {
                return .failure(ErrorSerializer.JSONDecoderFailed(json: "\(value)", errorText: error.localizedDescription))
            }
        case .failure(let error):
            return.failure(error)
        }
    }

    return response(responseSerializer: responseSerializer, completionHandler: completionHandler)
  }
}

Я нашел много учебных пособий, которые показывают способы достижения этой цели, но все они используют общий DataResponseSerializer. Например: Средний

1 Ответ

2 голосов
/ 05 июня 2019

Вы правы, DataResponseSerializer больше не является универсальным в Alamofire 5.

Что более важно, Alamofire теперь имеет поддержку Decodable, встроенную с responseDecodable и DecodableResponseSerializer, так что вы не можетене нужно писать самому.

...