2017-10-13 33 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) 

希望得到帮助。