2017-11-30 1 views
1

, 열거 형의 단일 속성스위프트 4 Codable 열거 속성 프로토콜 I도에 준거하여 3 개의 다른 구조체와 클래스가</p> <pre><code>enum ResultType: String, Codable { case photo = "PHOTO" case baseItem = "BASEITEM" case new = "NEW" } </code></pre> <p>I이 프로토콜을

protocol PaginableItem { 
    var resultType: ResultType { get set } 
} 

, PaginableItem 일부 PaginableItems와 클래스,

final class TimelineModel: Codable { 
    let stream: String 
    let participants: String 
    let header1: PaginableList 
    let header2: PaginableList 
    let items: PaginableList 
} 

final class PaginableList: Codable { 
    let data: [PaginableItem] 
    let pagination: Pagination 
} 

나는 노력 해요 g 스위프트 4 Codable을 사용하여 TimelineModel을 캐시하십시오. 그러나 최선의 방법은 아닙니다. Xcode가 Codable을 따르지 않는 PaginableItem에 대해 불평하고 있습니다.

init(from decoder: Decoder) throwsencode(to encoder: Encoder) throws을 입력해야합니다. ResultType?

PaginableItemCodable도 구현해야하나요?

+0

당신은 내가 PaginableItem''에 프로토콜'Codable'을 추가 PaginableList' –

답변

0

Must PaginableItem implement Codable also?

물론입니다! PaginableItem이 Codable을 준수하는지 확인하여 Cagable for PaginableList에 대한 전반적인 준수를 유지합니다.

결과 유형이 코드 가능 여부를 확인했습니다. 그러나 PaginableItem이 위험하지 않은 다른 객체를 추가하면 어떻게됩니까?

+0

'에서'Pagination' 항목에 대한 선언을 추가 할 수 있지만, 엑스 코드 충돌 : '치명적인 오류 : 배열 PaginableItem이 Encodable을 따르지 않기 때문에 이 Encodable을 따르지 않습니다.' – Christian

+0

당신이 시도하고 싶은 뭔가는 코드화 가능/디코드 가능 프로토콜에 대한 적합성을 해체하는 것입니다. 대신 모든 것을 코드화 할 수 있고, 인코딩 가능 코드는 – FullMetalFist

+0

클래스의 확장을 생성합니다. PaginableItem { let resultType : ResultType 초기화 (resultType : resultType) { self.resultType = resultType } 열거 CodingKeys : 문자열, CodingKey { // ... } } 확장 항목 : Encodable { FUNC 인코딩 (인코더 : 인코더) 발생 { var container = encoder.container (keyedBy : CodingKeys.self) 컨테이너를 시도하십시오. 인코딩 (resultType, forKey : .resultType) } } – FullMetalFist

2

PaginableItemCodable을 준수 할 수 없습니다. 스위프트 프로토콜이 자체적으로 준수 할 수 없기 때문입니다.

출처 :

Protocol doesn't conform to itself?

Encode/Decode Array of Types conforming to protocol with JSONEncoder

당신이 인코딩하려는 경우/당신은 AnyPaginableItem 클래스/구조체에서 그들을 삭제 입력 가지고 PaginableItem을 디코딩하고, 위의 두 번째 링크를 확인은 Encodable/Decodable을 준수합니다. 그래서 같은 그것을 한 적이 :

protocol PaginableItem { 
    var resultType: ResultType { get set } 
} 

class AnyPaginableItem: Codable { 
    var resultType: ResultType 

    init(resultType: ResultType) { 
     self.resultType = resultType 
    } 
} 

enum ResultType: String, Codable { 
    case photo = "PHOTO" 
    case baseItem = "BASEITEM" 
    case new = "NEW" 
} 

struct ContainsPaginableItem: Codable { 
    let paginableItem: AnyPaginableItem 
} 

let paginableItem = AnyPaginableItem(resultType: .photo) 
let itemToEncode = ContainsPaginableItem(paginableItem: paginableItem) 

let jsonEncoder = JSONEncoder() 
let jsonData = try jsonEncoder.encode(itemToEncode) 
let jsonString = String(data: jsonData, encoding: .utf8) 

이 예에서는 당신이 필요한 모든 가정 PaginableItem에 선언 할 수있는 속성을 암호화한다.

PaginableItem을 준수하는 유형의 모든 속성을 인코딩해야한다면 위의 두 번째 링크에서 채택 할 수있는 더 긴 해결책이 있습니다. 주`TimelineModel`을 인코딩 할 때

+0

두 번째 링크의 "더 긴 해법"은 완벽하게 작동합니다! 고마워. – Christian

관련 문제