Тип '' не соответствует протоколу 'Decodable' / 'Encodable'
У меня есть этот код для получения информации из 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
}
}
}
}
}
посмотрев это видео , я начал вносить изменения в свой код. Но, как я добавил, Codable
я получил эти ошибки
Тип Spty не соответствует протоколу Decodable
Тип Spty не соответствует протоколу Encodable

Ответы
Вместо NSNumber используйте собственные типы Swift, такие как Double, и выровняйте другой код с этим
struct Spty: Identifiable, Codable{
@DocumentID var id: String? = UUID().uuidString
var spty: String
var r: Double
var g: Double
var b: Double
}
Как вы можете видеть здесь: «Самый простой способ сделать тип кодируемым - объявить его свойства, используя типы, которые уже являются кодируемыми. Эти типы включают стандартные библиотечные типы, такие как String, Int и Double; и типы Foundation, такие как Date, Data и URL. . Любой тип, свойства которого кодируемы, автоматически соответствует Codable, просто декларируя это соответствие ". Это означает, что если вы хотите использовать codable, необходимо использовать:
Встроенные кодируемые типы - String, Int, Double, Data, URL Array,
Dictionary, Optional являются Codable, если они содержат типы Codable
Поскольку NSNumber не является частью Codable типов, вы не можете его использовать. По этой ссылке есть вопрос, аналогичный вашему, и вы можете увидеть там то же объяснение.