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 열거형에도 속성/이름 대소문자가 세 개 있어야 합니다.
나중에 생각해보니 설정할 때 비슷한 오류가 발생했습니다.Codable
NSNumber 유형의 변수로 구성된 우리반에.아래 이미지 참조:
변화하는NSNumber
원시 데이터 유형으로Int
문제를 해결했습니다.아래 참조:
NSString, NSRray 등 Swift Standard Library Value Type에 대한 브리징이 필요한 다른 데이터 유형의 경우에도 해당될 수 있습니다.
유사한 시나리오에서, 제 CodingKeys의 변수 이름이 클래스 변수와 같지 않아 같은 문제가 발생했습니다.아래참조
단순히 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: CodingKeys
enum 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
'source' 카테고리의 다른 글
더하다더하다WooCommerce 페이지 템플릿으로WooCommerce 페이지 템플릿으로 (0) | 2023.10.16 |
---|---|
graphql을 사용하여 스프링 부트에서 인증 (0) | 2023.10.16 |
Access Database의 모든 테이블을 Excel로 내보내는 방법 - 각 테이블에 대한 시트 (0) | 2023.10.16 |
MySQL의 개체 배열을 사용하여 JSON 열 쿼리 열 (0) | 2023.10.16 |
Concat 함수가 작동하지 않음 - 인수 개수가 잘못되었습니다. (0) | 2023.10.16 |