Codable Swift 4 erreur du compilation partielle

Bonjour,


 


J'essai d'utiliser le protocole Codable afin de parser les retours JSON d'une API.


J'ai créé un client de requête API générique que je vais pouvoir réutiliser sur n'importe quel API ( en modifiant le model).


 


Laissez moi vous montrer ( code ci-dessous)



protocol APIClient {
var session: URLSession { get }
func request<Model: Codable>(with request: URLRequest, operation: @escaping (Codable?) -> Model?, completion: @escaping (APIResult<Model, APIError>) -> Void)
}

extension APIClient {

typealias JSONTaskCompletionHandler = (Codable?, APIError?) -> Void

private func decodingTask<Model: Codable>(with request: URLRequest, decodingType: Model.Type, completionHandler completion: @escaping JSONTaskCompletionHandler) -> URLSessionDataTask {

let task = session.dataTask(with: request) { data, response, error in

guard let httpResponse = response as? HTTPURLResponse else {
completion(nil, .requestFailed)
return
}
if httpResponse.statusCode == 200 {
if let data = data {
do {
let genericModel = try JSONDecoder().decode(decodingType, from: data)
completion(genericModel, nil)
} catch {
completion(nil, .jsonConversionFailure)
}
} else {
completion(nil, .invalidData)
}
} else {
completion(nil, .responseUnsuccessful)
}
}

return task
}

private func encodingTask<Model: Codable>(with request: URLRequest, encodingType: Model, completionHandler completion: @escaping JSONTaskCompletionHandler) -> URLSessionDataTask {

var urlRequest = request
let encoder = JSONEncoder()
do {
let newTypeAsJSON = try encoder.encode(encodingType.self)
urlRequest.httpBody = newTypeAsJSON
} catch {
print(error)
completion(nil, .jsonConversionFailure)
}

let task = session.dataTask(with: urlRequest) { data, response, error in

guard let httpResponse = response as? HTTPURLResponse else {
completion(nil, .requestFailed)
return
}

if httpResponse.statusCode == 200 {
if let data = data {
completion(data, nil)
} else {
completion(nil, .invalidData)
}
} else {
completion(nil, .responseUnsuccessful)
}
}

return task
}

func request<Model: Codable>(with request: URLRequest, codingOperation: @escaping (Codable?) -> Model?, completion: @escaping (APIResult<Model, APIError>) -> Void) {
let taskClosure: URLSessionDataTask
if request.httpMethod == "GET" {
taskClosure = decodingTask(with: request, decodingType: Model.self) { (json , error) in

DispatchQueue.main.async {
guard let json = json else {
if let error = error {
completion(APIResult.failure(error))
} else {
completion(APIResult.failure(.invalidData))
}
return
}
if let value = codingOperation(json) {
completion(.success(value))
} else {
completion(.failure(.jsonParsingFailure))
}
}
}
}else{
// Problème se trouve ICI
taskClosure = encodingTask(with: request, encodingType: Model) { (json , error) in

DispatchQueue.main.async {
guard let json = json else {
if let error = error {
completion(APIResult.failure(error))
} else {
completion(APIResult.failure(.invalidData))
}
return
}
if let value = codingOperation(json) {
completion(.success(value))
} else {
completion(.failure(.jsonParsingFailure))
}
}
}
}
taskClosure.resume()
}
}


Le problème se trouve dans ma fonction "request", dans la première ligne du "else", Xcode me dit sans même compiler :


 


Argument type 'Model.Type' does not conform to expected type 'Decodable'


Argument type 'Model.Type' does not conform to expected type 'Encodable'


 


Je ne comprends pas.


 


Je m'en remet à  vous.


 


Merci et bonnes fêtes à  tous


 


Réponses

  • Bon erreur toute bête de ma part, je donne un type à  ma méthode ^^ et non une variable.  :P


Connectez-vous ou Inscrivez-vous pour répondre.