/ / Decodable Générique avec Swift 4 - swift, génériques, swift4, décodable

Générique décodable avec Swift 4 - swift, génériques, swift4, décodable

J'utilise le nouveau Decodable protocole introduit dans Swift 4. Dans mon test unitaire, je souhaite utiliser une méthode générique qui décode un fichier JSON spécifique pour un fichier spécifique. Decodable type.

J'ai écrit la fonction suivante correspondant à la JSONDecoder decode méthode:

 var jsonDecoder: JSONDecoder = {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return decoder
}()

static let bundle: Bundle = {
let testBundle = Bundle(for: Decodable.self)
let sampleURL = testBundle.url(forResource: "api_samples", withExtension: "bundle")!
return Bundle(url: sampleURL)!
}()

static func getJSONSample(fileName: String) throws -> Data {
let url = Decodable.bundle.url(forResource: fileName, withExtension: "json")!
return try Data(contentsOf: url)
}

func assertDecode<Obj>(_ type: Obj.Type, fileName: String) where Obj: Decodable {
do {
let data = try Decodable.getJSONSample(fileName: fileName)

let _ = try jsonDecoder.decode(type, from: data)
// Same by using Obj.self, Obj.Type

} catch let error {
XCTFail("Should not have failed for (type) with json (fileName): (error)")
}
}

Le compilateur me donne l'erreur suivante:

In argument type "Obj.Type", "Obj" does not conform to expected type "Decodable"

J'aurais imaginé que Obj est décodable en raison de la where clause.

Quel est le problème avec cette fonction?

Réponses:

1 pour la réponse № 1

Au lieu de faire une déclaration "où", simplifiez-vous la vie en limitant le générique lui-même:

func assertDecode<Obj: Decodable>(_ type: Obj.Type, fileName: String)