El tipo '' no se ajusta al protocolo 'Decodificable' / 'Codificable'
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
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
}
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:
Tipos codificables incorporados : cadena, int, doble, datos, matriz de URL,
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.