टाइप '' प्रोटोकॉल के अनुरूप नहीं है 'डीकोडेबल' / 'एनकोडेबल'

Dec 23 2020

मेरे पास फायरस्टार से जानकारी प्राप्त करने के लिए यह कोड है:

 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' प्रोटोकॉल 'एनकोडेबल' के अनुरूप नहीं है

जवाब

1 Asperi Dec 23 2020 at 01:49

NSNumber के बजाय, मूल स्विफ्ट प्रकारों का उपयोग करें, जैसे डबल, और उस पर अन्य कोड संरेखित करें

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

जैसा कि आप यहाँ देख सकते हैं "एक प्रकार का कोडेबल बनाने का सबसे सरल तरीका है कि पहले से ही कोडेबल होने वाले प्रकारों का उपयोग करके उसके गुणों की घोषणा करना। इन प्रकारों में मानक लाइब्रेरी प्रकार जैसे स्ट्रिंग, इंट, और डबल, और फ़ाउंडेशन प्रकार जैसे दिनांक, डेटा और URL शामिल हैं। किसी भी प्रकार के गुण जिनके कोडेबल हैं वे स्वतः ही उस अनुरूपता को घोषित करके कोडेबल के अनुरूप हो जाते हैं। " इसका मतलब है कि यदि आप कोडेबल का उपयोग करना चाहते हैं, तो इसका उपयोग करना आवश्यक है:

  1. अंतर्निहित कोडेबल प्रकार  - स्ट्रिंग, इंट, डबल, डेटा, URL एरे,

  2. यदि उनके पास कोडेबल प्रकार हैं , तो शब्दकोश, वैकल्पिक, कोडेबल हैं

चूंकि NSNumber कोडेबल प्रकारों का हिस्सा नहीं है, इसलिए आप इसका उपयोग नहीं कर सकते। इस लिंक पर आपका प्रश्न समान है और आप वहां भी वही स्पष्टीकरण देख सकते हैं।