O tipo '' não está em conformidade com o protocolo 'Decodable' / 'Encodable'
Eu tenho este código para obter informações do 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
}
}
}
}
}
depois de ver este vídeo , comecei a fazer alterações no meu código. Mas, ao adicionar Codable
, recebo esses erros
O tipo 'Spty' não está de acordo com o protocolo 'Decodificável'
O tipo 'Spty' não está em conformidade com o protocolo 'Encodable'

Respostas
Em vez de NSNumber, use tipos Swift nativos, como Double, e alinhe outro código a esse
struct Spty: Identifiable, Codable{
@DocumentID var id: String? = UUID().uuidString
var spty: String
var r: Double
var g: Double
var b: Double
}
Como você pode ver aqui "A maneira mais simples de tornar um tipo codificável é declarar suas propriedades usando tipos que já são codificáveis. Esses tipos incluem tipos de biblioteca padrão como String, Int e Double; e tipos de base como Date, Data e URL . Qualquer tipo cujas propriedades são codificáveis está automaticamente em conformidade com Codable apenas declarando essa conformidade. " Isso significa que se você deseja usar codificável, é necessário usar:
Tipos codificáveis integrados - String, Int, Double, Data, URL Array,
Dicionário, opcionais são codificáveis se contiverem tipos codificáveis
Visto que NSNumber não faz parte dos tipos Codable, você não pode usá-lo. Este link tem uma pergunta semelhante à sua e você pode ver ali a mesma explicação.