google-cloud-firestore - 类型 '' 不符合协议 '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”
解决方案
正如您在此处看到的“使类型可编码的最简单方法是使用已经可编码的类型来声明其属性。这些类型包括标准库类型,如 String、Int 和 Double;以及 Foundation 类型,如 Date、Data 和 URL . 任何属性可编码的类型只要声明符合性就自动符合 Codable。” 这意味着如果要使用可编码,则必须使用:
内置 Codable 类型 — String、Int、Double、Data、URL Array、
Dictionary, Optional如果它们包含 Codable 类型,则它们是 Codable
由于 NSNumber 不是 Codable 类型的一部分,因此您无法使用它。此链接与您的问题类似,您可以在那里看到相同的解释。