Il tipo "" non è conforme al protocollo "Decodificabile" / "Codificabile"

Dec 23 2020

Ho questo codice per ottenere informazioni da 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
            }
        }
      }
    }

   }

dopo aver visto questo video , ho iniziato ad apportare le modifiche al mio codice. Ma, come ho aggiunto, Codableho ricevuto quegli errori

Il tipo "Spty" non è conforme al protocollo "Decodificabile"

Il tipo "Spty" non è conforme al protocollo "Codificabile"

Risposte

1 Asperi Dec 23 2020 at 01:49

Invece di NSNumber usa tipi Swift nativi, come Double, e allinea altro codice a quello

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

Come puoi vedere qui "Il modo più semplice per rendere un tipo codificabile è dichiararne le proprietà utilizzando tipi che sono già codificabili. Questi tipi includono tipi di libreria standard come String, Int e Double; e tipi Foundation come Date, Data e URL . Qualsiasi tipo le cui proprietà sono codificabili si conforma automaticamente a Codable semplicemente dichiarando tale conformità. " Ciò significa che se vuoi usare codable, è necessario usare:

  1. Tipi codificabili incorporati  : String, Int, Double, Data, URL Array,

  2. Dizionario, facoltativo sono codificabili se contengono tipi codificabili

Poiché NSNumber non fa parte dei tipi Codable, non è possibile utilizzarlo. Questo link ha una domanda simile alla tua e puoi vedere la stessa spiegazione.