How to fix Alamofire 5 Error: "Cannot specialize non-generic type 'DataResponseSerializer'"?
How to fix Alamofire 5 Error: "Cannot specialize non-generic type 'DataResponseSerializer'"?
我正在将 Network Foundation 更新到 Swift(和 Alamofire)版本 5。
应该提供 "Generic Response Object Serialization" 的一种方法是抛出错误
Cannot specialize non-generic type 'DataResponseSerializer'
我认为在 Alamofire 5 中他们将类型 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。例如:Medium
你是对的,DataResponseSerializer
在 Alamofire 5 中不再通用。
更重要的是,Alamofire 现在支持 Decodable
内置 responseDecodable
和 DecodableResponseSerializer
,因此您无需自己编写。
我正在将 Network Foundation 更新到 Swift(和 Alamofire)版本 5。
应该提供 "Generic Response Object Serialization" 的一种方法是抛出错误
Cannot specialize non-generic type 'DataResponseSerializer'
我认为在 Alamofire 5 中他们将类型 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。例如:Medium
你是对的,DataResponseSerializer
在 Alamofire 5 中不再通用。
更重要的是,Alamofire 现在支持 Decodable
内置 responseDecodable
和 DecodableResponseSerializer
,因此您无需自己编写。