source

Codable 클래스가 Decodable 프로토콜을 준수하지 않습니다.

factcode 2023. 10. 16. 22:06
반응형

Codable 클래스가 Decodable 프로토콜을 준수하지 않습니다.

"유형 'Bookmark'가 프로토콜 'Decodable'과 일치하지 않음" 오류 메시지가 표시되는 이유는 무엇입니까?

class Bookmark: Codable {
   weak var publication: Publication?
   var indexPath: [Int]
   var locationInText = 0

   enum CodingKeys: String, CodingKey {
      case indexPath
      case locationInText
   }

   init(publication: Publication?, indexPath: [Int]) {
      self.publication = publication
      self.indexPath = indexPath
   }
}

출판물이 북마크를 소유하고 있지만 북마크가 어느 출판물에 속하는지 알아야 하므로 출판물 변수를 저장하고 싶지 않습니다.Publication(출판물)의 decode init(디코드 초기화)는 북마크 참조를 자신으로 설정합니다.

컴파일러가 필요한 것을 합성할 수 없습니다.init(from:)방법으로 인한weak참고로 직접 작성하셔야 합니다.

class Bookmark: Codable {
    weak var publication: Publication?
    var indexPath: [Int]
    var locationInText = 0

    private enum CodingKeys: String, CodingKey {
        case indexPath
        case locationInText
    }

    init(publication: Publication?, indexPath: [Int]) {
        self.publication = publication
        self.indexPath = indexPath
    }

    required init(from decoder:Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        indexPath = try values.decode([Int].self, forKey: .indexPath)
        locationInText = try values.decode(Int.self, forKey: .locationInText)
    }
}

"유형 'Bookmark'가 프로토콜 'Decodable'과 일치하지 않음" 오류 메시지가 표시되는 이유

출판물이 디코딩 가능하지 않기 때문이거나(당신은 그것이 무엇인지 보여주지 않았기 때문에 구분하기 어렵습니다) 또는weak에 대한 지명.publication.

어느 쪽이든 쉽게 고칠 수 있습니다. 구현만 하면 됩니다.init(from:)Decodable의 구현을 완료하는 것입니다. 컴파일러는 단순히 이 구현이 합성될 수 없다는 것을 알려주는 것입니다.

이 메시지를 받을 수 있는 또 다른 이유는 CodingKeys 열거가 완전하지 않은 경우입니다.데이터 유형에 속성이 세 개 있는 경우 CodingKeys 열거형에도 속성/이름 대소문자가 세 개 있어야 합니다.

나중에 생각해보니 설정할 때 비슷한 오류가 발생했습니다.CodableNSNumber 유형의 변수로 구성된 우리반에.아래 이미지 참조:

enter image description here

변화하는NSNumber원시 데이터 유형으로Int문제를 해결했습니다.아래 참조:

enter image description here

NSString, NSRray 등 Swift Standard Library Value Type에 대한 브리징이 필요한 다른 데이터 유형의 경우에도 해당될 수 있습니다.

유사한 시나리오에서, 제 CodingKeys의 변수 이름이 클래스 변수와 같지 않아 같은 문제가 발생했습니다.아래참조

enter image description here

단순히 CodingKeys 열거가 완전하지 않기 때문에 다음을 추가합니다.publication그것을 달성하기 위한 열거형의 재산.

시도해 보십시오.

class Bookmark: Codable {
   weak var publication: Publication?
   var indexPath: [Int]
   var locationInText = 0

   // All your properties should be included
   enum CodingKeys: String, CodingKey {
      case indexPath
      case locationInText
      case publication   // this one was missing
   }
}

이제 구현을 종합할 수 있기 때문에 init 방법은 더 이상 필요 없습니다.

코드화 가능한 모든 클래스는 모든 속성 코드화 가능해야 합니다.String, Int, Double 및 Foundation 유형인 Date, Data 및 UR과 같은 표준 라이브러리 유형은 코드화 가능한 프로토콜을 확인하지만 일부는 그렇지 않습니다.

예를 들어 아래 노트 클래스에는 코드화 가능한 프로토콜을 확인하는 문자열의 모든 속성이 있으므로 오류가 없습니다.

그러나 UI 이미지는 코드 가능한 프로토콜을 확인하지 않으므로 오류를 던집니다.

속성에 기본값이 있는 경우에만 속성을 키 열거 부호화에서 생략할 수 있습니다.

애플 문서에서

인스턴스를 디코딩할 때 속성이 나타나지 않거나 인코딩된 표현에 특정 속성이 포함되지 않아야 하는 경우 CodingKeys 열거에서 속성을 생략합니다.CodingKeys에서 생략된 속성은 포함된 유형이 Decodable 또는 Codable에 대한 자동 준수를 받으려면 기본값이 필요합니다.

간단히 말해, 코딩 가능을 구현하는 동안 비원격 데이터 유형(평균 클래스 유형 또는 목적-c 클래스일 수 있음)인 모든 속성은 코딩 가능해야 합니다.

   weak var publication: Publication?

이 경우 출판물은 유형 클래스이므로 출판물은 코드 가능을 구현해야 합니다.

좀 바보같지만 다른 사람에게 도움이 될 경우가 있습니다.이 오류는 제가 입력을 해서 생긴 것입니다.enum CodingKeys: CodingKeysenum CodingKeys: CodingKey.

수 , 합니다 합니다.data type데이터 클래스 필드에 사용하고 있습니다.

했습니다 1개를 했습니다.weak var publication: Publication?그리고 있다면 해야 할 입니다, 입니다.Publication데이터 클래스는 다음을 준수합니다.Codable수업이든 아니든

아동 계층에 대해서도 동일한 프로토콜을 준수해야 하기 때문에 필드도 인코딩 및 디코딩이 가능해야 합니다.

저는 이 수정사항을 우연히 발견한 비슷한 문제가 있었습니다.저는 스위프트가 처음이라 왜 작동하는지 잘 모르겠어요!아는 사람이 있다면 저는 그 지식을 감사히 받겠습니다.

변경했습니다.

let id, type: Int

다음 항목에 대해:

let id: Int
let type: Int

언급URL : https://stackoverflow.com/questions/48568373/codable-class-does-not-conform-to-protocol-decodable

반응형