El tipo '' no se ajusta al protocolo 'Decodificable' / 'Codificable'

Dec 23 2020

Tengo este código para obtener información 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
            }
        }
      }
    }

   }

después de ver este video , comencé a hacer cambios en mi código. Pero, como agregué Codable, obtuve esos errores

El tipo 'Spty' no se ajusta al protocolo 'Decodificable'

El tipo 'Spty' no se ajusta al protocolo 'Encodable'

Respuestas

1 Asperi Dec 23 2020 at 01:49

En lugar de NSNumber, use tipos Swift nativos, como Double, y alinee otro código con ese

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

Como puede ver aquí, "La forma más sencilla de hacer que un tipo sea codificable es declarar sus propiedades utilizando tipos que ya son codificables. Estos tipos incluyen tipos de biblioteca estándar como String, Int y Double; y tipos Foundation como Date, Data y URL . Cualquier tipo cuyas propiedades sean codificables se ajusta automáticamente a Codable simplemente declarando esa conformidad ". Eso significa que si desea usar codificable, es necesario usar:

  1. Tipos codificables incorporados  : cadena, int, doble, datos, matriz de URL,

  2. Diccionario, los opcionales son codificables si contienen tipos codificables

Dado que NSNumber no forma parte de los tipos codificables, no puede utilizarlo. Este enlace tiene una pregunta similar a la tuya y puedes ver allí la misma explicación.