Тип '' не соответствует протоколу 'Decodable' / 'Encodable'

Dec 23 2020

У меня есть этот код для получения информации из 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

Ответы

1 Asperi Dec 23 2020 at 01:49

Вместо 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
}
1 SamuelRomero Dec 23 2020 at 22:21

Как вы можете видеть здесь: «Самый простой способ сделать тип кодируемым - объявить его свойства, используя типы, которые уже являются кодируемыми. Эти типы включают стандартные библиотечные типы, такие как String, Int и Double; и типы Foundation, такие как Date, Data и URL. . Любой тип, свойства которого кодируемы, автоматически соответствует Codable, просто декларируя это соответствие ". Это означает, что если вы хотите использовать codable, необходимо использовать:

  1. Встроенные кодируемые типы  - String, Int, Double, Data, URL Array,

  2. Dictionary, Optional являются Codable, если они содержат типы Codable

Поскольку NSNumber не является частью Codable типов, вы не можете его использовать. По этой ссылке есть вопрос, аналогичный вашему, и вы можете увидеть там то же объяснение.