''유형이 'Decodable'/ 'Encodable'프로토콜을 따르지 않습니다.

Dec 23 2020

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
            }
        }
      }
    }

   }

이 비디오를 본 후 코드를 변경하기 시작했습니다. 그러나 내가 추가함에 따라 Codable이러한 오류가 발생했습니다.

'Spty'유형이 'Decodable'프로토콜을 준수하지 않습니다.

'Spty'유형이 'Encodable'프로토콜을 준수하지 않습니다.

답변

1 Asperi Dec 23 2020 at 01:49

NSNumber 대신 Double과 같은 기본 Swift 유형을 사용하고 다른 코드를 이에 맞게 조정하십시오.

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

여기에서 볼 수 있듯이 "유형을 코딩 가능하게 만드는 가장 간단한 방법은 이미 코딩 가능한 유형을 사용하여 속성을 선언하는 것입니다. 이러한 유형에는 String, Int 및 Double과 같은 표준 라이브러리 유형과 Date, Data 및 URL과 같은 Foundation 유형이 포함됩니다. . 속성을 코딩 할 수있는 모든 유형은 해당 준수를 선언하는 것만으로도 자동으로 Codable을 준수합니다. " 즉, codable을 사용하려면 다음을 사용해야합니다.

  1. 내장 코딩 가능 유형  — String, Int, Double, Data, URL Array,

  2. 사전, 선택적 은 Codable 유형을 포함하는 경우 Codable입니다.

NSNumber는 Codable 유형의 일부가 아니므로 사용할 수 없습니다. 이 링크 는 귀하와 유사한 질문을 가지고 있으며 동일한 설명을 볼 수 있습니다.