如何修复 Alamofire 5 错误:“无法专门化非通用类型‘DataResponseSerializer’”?

Noo*_*dew 3 generics ios swift alamofire swift5

我正在将网络基础更新到 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

我发现许多教程展示了实现这一点的方法,但它们都共享通用的 DataResponseSerializer。例如:

Jon*_*ier 7

你是对的,DataResponseSerializer在 Alamofire 5 中不再是通用的。

更重要的是,Alamofire 现在支持Decodable内置responseDecodableDecodableResponseSerializer,因此您无需自己编写。