'' Tipi, 'Kod Çözülebilir' / 'Kodlanabilir' protokolüne uymuyor
Firestore'dan bilgi almak için şu koda sahibim:
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
}
}
}
}
}
Bu videoyu gördükten sonra kodumda değişiklik yapmaya başladım. Ama eklediğimde Codable
bu hataları aldım
'Spty' türü 'Kod Çözülebilir' protokolüne uymuyor
'Spty' türü 'Kodlanabilir' protokolüne uymuyor

Yanıtlar
NSNumber yerine Double gibi yerel Swift türlerini kullanın ve diğer kodu buna göre hizalayın
struct Spty: Identifiable, Codable{
@DocumentID var id: String? = UUID().uuidString
var spty: String
var r: Double
var g: Double
var b: Double
}
Gördüğünüz gibi burada "bir tür kodlanabilir yapmak için basit yolu zaten bir kodlanabilir olan türleri kullanarak özelliklerini beyan etmektir Bu tür standart kütüphanesi dize, Int ve Çift benzeri türlerini içerir;. Tarih, Veri ve URL gibi ve Vakıf türleri . Özellikleri kodlanabilir olan her tür, yalnızca bu uygunluğu bildirerek Kodlanabilir'e otomatik olarak uyar. " Bu, kodlanabilir kullanmak istiyorsanız şunu kullanmanız gerektiği anlamına gelir:
Yerleşik Kodlanabilir türler - String, Int, Double, Data, URL Array,
Sözlük, Kodlanabilir türler içeriyorsa İsteğe Bağlı Kodlanabilir
NSNumber, Kodlanabilir türlerin bir parçası olmadığından, onu kullanamazsınız. Bu bağlantıda sizinkine benzer bir soru var ve orada aynı açıklamayı görebilirsiniz.