Le type «» n'est pas conforme au protocole «Décodable» / «Encodable»
J'ai ce code pour obtenir des informations auprès 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
}
}
}
}
}
après avoir vu cette vidéo , j'ai commencé à apporter des modifications à mon code. Mais, comme je l'ai ajouté, Codable
j'ai eu ces erreurs
Le type «vide» n'est pas conforme au protocole «décodable»
Le type 'Vide' n'est pas conforme au protocole 'Encodable'

Réponses
Au lieu de NSNumber, utilisez des types Swift natifs, comme Double, et alignez d'autres codes sur cela
struct Spty: Identifiable, Codable{
@DocumentID var id: String? = UUID().uuidString
var spty: String
var r: Double
var g: Double
var b: Double
}
Comme vous pouvez le voir ici "Le moyen le plus simple de rendre un type codable consiste à déclarer ses propriétés à l'aide de types qui sont déjà codables. Ces types incluent des types de bibliothèque standard tels que String, Int et Double; et les types Foundation tels que Date, Data et URL . Tout type dont les propriétés sont codables se conforme automatiquement à Codable simplement en déclarant cette conformité. " Cela signifie que si vous souhaitez utiliser codable, il faut utiliser:
Types codables intégrés - String, Int, Double, Data, URL Array,
Dictionnaire, facultatif sont codables s'ils contiennent des types codables
Étant donné que NSNumber ne fait pas partie des types codables, vous ne pouvez pas l'utiliser. Ce lien a une question similaire à la vôtre et vous pouvez y voir la même explication.