टाइप '' प्रोटोकॉल के अनुरूप नहीं है 'डीकोडेबल' / 'एनकोडेबल'
मेरे पास फायरस्टार से जानकारी प्राप्त करने के लिए यह कोड है:
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' प्रोटोकॉल 'एनकोडेबल' के अनुरूप नहीं है

जवाब
NSNumber के बजाय, मूल स्विफ्ट प्रकारों का उपयोग करें, जैसे डबल, और उस पर अन्य कोड संरेखित करें
struct Spty: Identifiable, Codable{
@DocumentID var id: String? = UUID().uuidString
var spty: String
var r: Double
var g: Double
var b: Double
}
जैसा कि आप यहाँ देख सकते हैं "एक प्रकार का कोडेबल बनाने का सबसे सरल तरीका है कि पहले से ही कोडेबल होने वाले प्रकारों का उपयोग करके उसके गुणों की घोषणा करना। इन प्रकारों में मानक लाइब्रेरी प्रकार जैसे स्ट्रिंग, इंट, और डबल, और फ़ाउंडेशन प्रकार जैसे दिनांक, डेटा और URL शामिल हैं। किसी भी प्रकार के गुण जिनके कोडेबल हैं वे स्वतः ही उस अनुरूपता को घोषित करके कोडेबल के अनुरूप हो जाते हैं। " इसका मतलब है कि यदि आप कोडेबल का उपयोग करना चाहते हैं, तो इसका उपयोग करना आवश्यक है:
अंतर्निहित कोडेबल प्रकार - स्ट्रिंग, इंट, डबल, डेटा, URL एरे,
यदि उनके पास कोडेबल प्रकार हैं , तो शब्दकोश, वैकल्पिक, कोडेबल हैं
चूंकि NSNumber कोडेबल प्रकारों का हिस्सा नहीं है, इसलिए आप इसका उपयोग नहीं कर सकते। इस लिंक पर आपका प्रश्न समान है और आप वहां भी वही स्पष्टीकरण देख सकते हैं।