2017-10-13 1 views
2

다음은 code입니다.신속한 코드 가능 디코드 수동 선택 변수

import Foundation 

let jsonData = """ 
[ 
    {"firstname": "Tom", "lastname": "Smith", "age": "28"}, 
    {"firstname": "Bob", "lastname": "Smith"} 
] 
""".data(using: .utf8)! 

struct Person: Codable { 
    let firstName, lastName: String 
    let age: String? 

    enum CodingKeys : String, CodingKey { 
     case firstName = "firstname" 
     case lastName = "lastname" 
     case age 
    } 

    init(from decoder: Decoder) throws { 
     let values = try decoder.container(keyedBy: CodingKeys.self) 
     firstName = try values.decode(String.self, forKey: .firstName) 
     lastName = try values.decode(String.self, forKey: .lastName) 
     age = try values.decode(String.self, forKey: .age) 
    } 

} 

let decoded = try JSONDecoder().decode([Person].self, from: jsonData) 
print(decoded) 

문제는 age = try values.decode(String.self, forKey: .age)에서 발생합니다. 내가 그 init 기능을 잘 때 작동합니다. 오류는 No value associated with key age (\"age\").입니다.

옵션을 만드는 방법과 존재하지 않을 때 크래시하지 않는 방법에 대한 아이디어가 있으십니까? 나는 또한 다른 이유 때문에 init 함수가 필요하지만, 그냥 무슨 일이 일어나고 있는지 설명하는 간단한 예제를 만들었습니다.

+3

비교 [Deconable for JSON Parsing을 사용할 때 선택 사항과 decodeIfPresent의 차이점] (https://stackoverflow.com/questions/46292325/what-is-difference-between-optional-and-decodeifpresent-when-using) -decodable-for). –

+0

@ MartinR 매우 도움이됩니다! 정말 고마워. –

답변

5

나이는 선택 사항입니다 :

let age: String? 

그래서 이런 식으로 해독하려고 :

let age: String? = try values.decodeIfPresent(String.self, forKey: .age) 
+0

대단히 감사합니다! 스택 오버플로는 몇 분 더 기다릴 수 없습니다. 그들이 나를시켜 주면 그렇게 할거야. –

1

이 나를 위해 일이다.

var age: String? = nil 
age = try? container.decode(String.self, forKey: .age) 

도움을 받으시기 바랍니다.