如何解决类型 '' 不符合协议 'Decodable'/'Encodable'
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
}
}
}
}
}
在看到 this video 后,我开始对我的代码进行更改。但是,当我添加 Codable
时,我遇到了这些错误
类型 'Spty' 不符合协议 'Decodable'
类型 'Spty' 不符合协议 'encodable'
解决方法
使用原生 Swift 类型(如 Double)代替 NSNumber,并将其他代码与其对齐
struct Spty: Identifiable,Codable{
@DocumentID var id: String? = UUID().uuidString
var spty: String
var r: Double
var g: Double
var b: Double
}
,
如您所见 here “使类型可编码的最简单方法是使用已经可编码的类型声明其属性。这些类型包括标准库类型,如 String、Int 和 Double;以及基础类型像日期、数据和 URL。任何属性可编码的类型自动符合 Codable,只需声明该一致性即可。”也就是说,如果要使用codable,就要使用:
-
内置编码类型 — String,Int,Double,Data,URL Array,
-
Dictionary,Optional 如果它们包含 Codable 类型,则是 Codable
由于 NSNumber 不是 Codable 类型的一部分,因此您无法使用它。这个 link 有一个与您类似的问题,您可以在那里看到相同的解释。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。