Formation PUB900 : Développer une application pour iPhone avec SwiftUI, H-2024 Conversion JSON (Codable, Encodable, Decodable)

48.2 Rendre un modèle SwiftData encodable ou décodable


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 :

  • Définir une énumération nommée CodingKey qui répond au protocole CodingKey pour lister toutes les propriétés qui doivent pouvoir être encodées ou décodées. Le nom de chaque cas de l'énumération doit correspondre au nom d'une propriété à encoder ou à décoder.
    SwiftUI

    @Model
    final class Item: Codable {   // ou Encodable, ou Decodable
      var code: String
      var titre: String

      enum CodingKeys: CodingKey {
        case code, titre
      }
      ...
    }

  • Pour que la classe réponde au protocole Encodable, ajouter une méthode encode(to:) pour déterminer comment les valeurs peuvent être encodées.
    SwiftUI

    @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)
      }
    }

  • Pour que la classe réponde au protocole Decodable, ajouter un constructeur init(from:) pour déterminer comment les valeurs peuvent être décodées. Assurez-vous d'utiliser le bon type pour le décodage (dans l'exemple : String.self).
    SwiftUI

    @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.

Pour plus d'information

« 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é

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre