2017-12-20 9 views
2

과 옵션 열거를 디코딩하지 않습니다 내 구조체의 복호, 나는이 같은 열거를 정의 잘못된 값

enum ClubLevel: Int, Codable { 
    case golden = 1, silver, bronze 
} 

내가 유형 ClubLevel의 선택적 속성이 나는 init(from decoder: Decoder)에서이 속성을 디코딩 할 때 :

debugDescription : "Cannot initialize ClubLevel from invalid Int value 0", underlyingError: nil"

self.clubLevel = try container.decode(ClubLevel?.self, forKey: .clubLevel) 

는이 오류에 직면

이 속성이 선택 사항인지 궁금합니다. 디코더가 계속되지 않습니다.

아이디어가 있습니까?

+0

감사의 차이가'시도 무슨 당신이 설명 할 수 있습니까? container.decode (ClubLevel.self, forKey : .clubLevel)'및'container.decode (ClubLevel? .self, forKey : .clubLevel)'을 (를) 사용하십시오. 자세한 답변을 주셔서 감사합니다. –

답변

2

라인

self.clubLevel = try container.decode(ClubLevel?.self, forKey: .clubLevel) 

실패하는 경우 nil을 할당, ClubLevel를 해독하려고하지 않습니다. 그것이 무엇 것은 :

  1. 시도는 clubLevel 키 (null로 JSON 표현) nil를 디코딩 할 수 있습니다. 실패한 경우
  2. clubLevel 키의 경우 ClubLevel의 디코딩을 시도하십시오. 실패 할 경우,
  3. 는 그래서 clubLevel 키 값도 nil도 유효한 ClubLevel 표현 인 경우가 슬로우 오류가 발생합니다 오류

을 던져. 또한 clubLevel 키가 누락 된 경우 (nil 값이 아닌) 오류가 발생한다는 것을 의미합니다. 누락 된 키를 무시

decodeIfPresent로 수행됩니다

self.clubLevel = try container.decodeIfPresent(ClubLevel.self, forKey: .clubLevel) 

이 지금됩니다

  1. 돌아 nilclubLevel 키가 컨테이너에서 누락 된 경우. 키가있는 경우
  2. clubLevel 키의 경우 nil (JSON에 null으로 표시)을 해독하려고합니다. 실패한 경우
  3. clubLevel 키의 경우 ClubLevel의 디코딩을 시도하십시오. 실패 할 경우,
  4. 오류

init(from:)의 컴파일러가 생성 구현에 선택적 항목을 디코딩하는 기본 동작을 던져. clubLevel 키의 값이 유효한 ClubLevel이 아니기 때문에 여전히 오류가 발생합니다. 그냥 어떤 이유 (키 누락, 잘못된 값 등을 위해 실패 디코딩에 nil를 할당 시도하고 ClubLevel 디코딩하려면

), 당신은 try?를 사용하려면 : 당신의 코멘트 @hamish에 대한

self.clubLevel = try? container.decode(ClubLevel.self, forKey: .clubLevel) 
+0

감사합니다. 메리 크리스마스 –