Typ '' entspricht nicht dem Protokoll 'Decodable' / 'Encodable'
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, Codable
bekam ich diese Fehler
Der Typ 'Spty' entspricht nicht dem Protokoll 'Decodable'.
Der Typ 'Spty' entspricht nicht dem Protokoll 'Encodable'.

Antworten
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
}
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:
Integrierte codierbare Typen - String, Int, Double, Daten, URL-Array,
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.