2017-10-13 8 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

比較[Decodeable 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) 

希望します。

関連する問題