2017-10-13 72 views
2

我有以下codeSwift Codable解碼手動可選變量

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\").

任何關於如何使這個可選的想法,並沒有崩潰時,它不存在?由於其他原因,我也需要這個函數,但只是一個簡單的例子來解釋發生了什麼。

+3

比較[使用Decodable for JSON解析時可選和decodeIfPresent之間有什麼區別?](https://stackoverflow.com/questions/46292325/what-is-difference-between-optional-and-decodeifpresent-when-using -decodable換)。 –

+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) 

希望得到幫助。