Typ '' entspricht nicht dem Protokoll 'Decodable' / 'Encodable'

Dec 23 2020

Ich habe diesen Code, um Informationen vom Firestore zu erhalten:

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

   }

Nachdem ich dieses Video gesehen hatte , begann ich, die Änderungen an meinem Code vorzunehmen. Aber als ich hinzufügte, Codablebekam ich diese Fehler

Der Typ 'Spty' entspricht nicht dem Protokoll 'Decodable'.

Der Typ 'Spty' entspricht nicht dem Protokoll 'Encodable'.

Antworten

1 Asperi Dec 23 2020 at 01:49

Verwenden Sie anstelle von NSNumber native Swift-Typen wie Double und richten Sie anderen Code darauf aus

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

Wie Sie hier sehen können "Die einfachste Möglichkeit, einen Typ codierbar zu machen, besteht darin, seine Eigenschaften mithilfe von Typen zu deklarieren, die bereits codierbar sind. Diese Typen umfassen Standardbibliothekstypen wie String, Int und Double sowie Foundation-Typen wie Datum, Daten und URL Jeder Typ, dessen Eigenschaften codierbar sind, entspricht automatisch Codable, indem nur diese Konformität deklariert wird. " Das heißt, wenn Sie codable verwenden möchten, müssen Sie Folgendes verwenden:

  1. Integrierte codierbare Typen  - String, Int, Double, Daten, URL-Array,

  2. Dictionary, Optional sind codierbar, wenn sie codierbare Typen enthalten

Da NSNumber nicht Teil von Codable-Typen ist, können Sie es nicht verwenden. Dieser Link hat eine ähnliche Frage wie Sie und Sie können dort die gleiche Erklärung sehen.