Noodledew
Noodledew

Reputation: 519

How to fix Alamofire 5 Error: "Cannot specialize non-generic type 'DataResponseSerializer'"?

I am updating a Network Foundation to Swift (and Alamofire) Version 5.

One method that should provide "Generic Response Object Serialization" is throwing the error

Cannot specialize non-generic type 'DataResponseSerializer'

I think in Alamofire 5 they made the Type DataResponseSerializer non-generic. Any ideas how to achieve the same behavior in the newest version? Unfortunately I am not very familiar neither with Alamofire nor 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)
  }
}

I found many Tutorials that show ways to achieve this, but all of them share the generic DataResponseSerializer. For example: Medium

Upvotes: 4

Views: 3379

Answers (1)

Jon Shier
Jon Shier

Reputation: 12770

You're correct, DataResponseSerializer is no longer generic in Alamofire 5.

More importantly, Alamofire now has support for Decodable built in with responseDecodable and DecodableResponseSerializer, so you don't need to write it yourself.

Upvotes: 8

Related Questions