Jenis '' tidak sesuai dengan protokol 'Decodable' / 'Encodable'
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, Codable
saya mendapat kesalahan itu
Jenis 'Spty' tidak sesuai dengan protokol 'Decodable'
Jenis 'Spty' tidak sesuai dengan protokol 'Dapat Dienkodekan'
Jawaban
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
}
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:
Jenis Kode Bawaan - String, Int, Double, Data, Array URL,
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.