类型 '' 不符合协议 'Decodable'/'Encodable'

Posted

技术标签:

【中文标题】类型 \'\' 不符合协议 \'Decodable\'/\'Encodable\'【英文标题】:Type '' does not conform to protocol 'Decodable'/'Encodable'类型 '' 不符合协议 'Decodable'/'Encodable' 【发布时间】:2020-12-22 18:38:07 【问题描述】:

我有这段代码可以从 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
            
        
      
    

   

在看到this video 之后,我开始对我的代码进行更改。但是,当我添加 Codable 时,我遇到了这些错误

类型“Spty”不符合协议“Decodable”

类型“Spty”不符合协议“Encodable”

【问题讨论】:

Firestore 不支持Codable 的目标是什么? 【参考方案1】:

如您所见here“使类型可编码的最简单方法是使用已经可编码的类型声明其属性。这些类型包括标准库类型,如 String、Int 和 Double;以及 Foundation 类型,如 Date 、数据和 URL。任何属性可编码的类型都自动符合 Codable ,只需声明该一致性即可。”也就是说如果要使用codable,就要使用:

    内置可编码类型 — String、Int、Double、Data、URL Array,

    Dictionary, Optional 如果它们包含 Codable 类型,则它们是 Codable

由于 NSNumber 不是 Codable 类型的一部分,因此您无法使用它。这个link 有一个与你类似的问题,你可以在那里看到相同的解释。

【讨论】:

【参考方案2】:

使用原生 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

【讨论】:

以上是关于类型 '' 不符合协议 'Decodable'/'Encodable'的主要内容,如果未能解决你的问题,请参考以下文章

Codable 类不符合协议 Decodable

SwiftUI - 类型“服务”不符合协议“可解码”

字符串字典:任何不符合协议“可解码”[重复]

致命错误:Dictionary<String, Any> 不符合 Decodable 因为 Any 不符合 Decodable

当属性类型可能从 Int 更改为 String 时,如何使用 Decodable 协议解析 JSON?

Swift 4 JSON Decodable 解码类型更改的最简单方法