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 № 1Au 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)