Jenis '' tidak sesuai dengan protokol 'Decodable' / 'Encodable'

Dec 23 2020

Saya memiliki kode ini untuk mendapatkan informasi dari 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
            }
        }
      }
    }

   }

setelah melihat video ini , saya mulai membuat perubahan pada kode saya. Tapi, saat saya menambahkan, Codablesaya mendapat kesalahan itu

Jenis 'Spty' tidak sesuai dengan protokol 'Decodable'

Jenis 'Spty' tidak sesuai dengan protokol 'Dapat Dienkodekan'

Jawaban

1 Asperi Dec 23 2020 at 01:49

Alih-alih NSNumber, gunakan jenis Swift asli, seperti Double, dan sejajarkan kode lain dengan itu

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

Seperti yang Anda lihat di sini "Cara termudah untuk membuat suatu jenis dapat dikodekan adalah dengan mendeklarasikan propertinya menggunakan jenis yang sudah dapat dikodekan. Jenis ini mencakup jenis pustaka standar seperti String, Int, dan Ganda; dan jenis Landasan seperti Tanggal, Data, dan URL . Semua jenis yang propertinya dapat dikodekan secara otomatis sesuai dengan Codable hanya dengan menyatakan kesesuaian itu. " Artinya jika ingin menggunakan codable maka perlu digunakan:

  1. Jenis Kode Bawaan  - String, Int, Double, Data, Array URL,

  2. Dictionary, Opsional adalah Codable jika mengandung tipe Codable

Karena NSNumber bukan bagian dari tipe Codable, Anda tidak dapat menggunakannya. Tautan ini memiliki pertanyaan yang mirip dengan Anda dan Anda dapat melihat penjelasan yang sama di sana.