Le type «» n'est pas conforme au protocole «Décodable» / «Encodable»

Dec 23 2020

J'ai ce code pour obtenir des informations auprès de firestore:

 struct Spty: Identifiable, Codable{
   @DocumentID var id: String? = UUID().uuidString
   var spty: String
   var r: NSNumber
   var g: NSNumber
   var b: NSNumber
}

 class SptyViewModel: NSObject, ObservableObject{
   @Published var specialities = [Spty]()
   @Published var search = ""
     func fetchData(){
      let db = Firestore.firestore()
        db.collection("specialities").addSnapshotListener { (querySnapshot, error) in
        guard let documents = querySnapshot else {return }
        self.specialities = documents.documents.compactMap { (doc) -> Spty? in
          let id = doc.documentID
            if  let spty = doc.get("spty") as? String,
            let r = doc.get("r") as?  NSNumber,
            let g = doc.get("g") as?  NSNumber,
            let b = doc.get("b") as?  NSNumber{
            
            return Spty(id: id, spty: spty, r: r , g: g , b: b )
            }
            else{
                return nil
            }
        }
      }
    }

   }

après avoir vu cette vidéo , j'ai commencé à apporter des modifications à mon code. Mais, comme je l'ai ajouté, Codablej'ai eu ces erreurs

Le type «vide» n'est pas conforme au protocole «décodable»

Le type 'Vide' n'est pas conforme au protocole 'Encodable'

Réponses

1 Asperi Dec 23 2020 at 01:49

Au lieu de NSNumber, utilisez des types Swift natifs, comme Double, et alignez d'autres codes sur cela

struct Spty: Identifiable, Codable{
   @DocumentID var id: String? = UUID().uuidString
   var spty: String
   var r: Double
   var g: Double
   var b: Double
}
1 SamuelRomero Dec 23 2020 at 22:21

Comme vous pouvez le voir ici "Le moyen le plus simple de rendre un type codable consiste à déclarer ses propriétés à l'aide de types qui sont déjà codables. Ces types incluent des types de bibliothèque standard tels que String, Int et Double; et les types Foundation tels que Date, Data et URL . Tout type dont les propriétés sont codables se conforme automatiquement à Codable simplement en déclarant cette conformité. " Cela signifie que si vous souhaitez utiliser codable, il faut utiliser:

  1. Types codables intégrés  - String, Int, Double, Data, URL Array,

  2. Dictionnaire, facultatif sont codables s'ils contiennent des types codables

Étant donné que NSNumber ne fait pas partie des types codables, vous ne pouvez pas l'utiliser. Ce lien a une question similaire à la vôtre et vous pouvez y voir la même explication.