Lorsque les données à encoder proviennent d'un modèle SwiftData, il y a une précaution de plus à faire pour assurer que le modèle réponde au protocole Encodable ou à Decodable ou encore aux deux (Codable).
Sans cette précaution, vous obtiendrez les messages d'erreur « Type 'Item' does not conform to protocol 'Encodable' » ou « Type 'Item' does not conform to protocol 'Decodable' ».
Ceci est dû au fait que la macro @Model ajoute du code pour nous et c'est une partie de ce code qui ne répond pas à ces protocoles.
Pour régler ce problème, il faut spécifier comment encoder ou décoder les données de ce modèle.
Ceci est réalisé à l'aide de ces étapes :
@Model
final class Item: Codable { // ou Encodable, ou Decodable
var code: String
var titre: String
enum CodingKeys: CodingKey {
case code, titre
}
...
}
@Model
final class Item: Encodable { // ou Codable
...
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(code, forKey: .code)
try container.encode(titre, forKey: .titre)
}
}
@Model
final class Item: Decodable { // ou Codable
...
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.code = try container.decode(String.self, forKey: .code)
self.titre = try container.decode(String.self, forKey: .titre)
}
}
Il est maintenant possible d'encoder en JSON des objets de la classe Item ou de décoder du JSON pour instancier des objets de cette classe.
« How to make SwiftData models conform to Codable ». Hacking with Swift. https://www.hackingwithswift.com/quick-start/swiftdata/how-to-make-swiftdata-models-conform-to-codable
« Making your SwiftData models Codable ». Donny Wals. https://www.donnywals.com/making-your-swiftdata-models-codable/
▼Publicité