微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决类型 '' 不符合协议 '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
            }
        }
      }
    }

   }

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

类型 'Spty' 不符合协议 'Decodable'

类型 'Spty' 不符合协议 'encodable'

image

解决方法

使用原生 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,就要使用:

  1. 内置编码类型 — String,Int,Double,Data,URL Array,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。