【发布时间】:2017-10-13 06:17:55
【问题描述】:
假设我有以下代码:
import Foundation
let jsonData = """
[
{"firstname": "Tom", "lastname": "Smith", "age": {"realage": "28"}},
{"firstname": "Bob", "lastname": "Smith", "age": {"fakeage": "31"}}
]
""".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
}
}
let decoded = try JSONDecoder().decode([Person].self, from: jsonData)
print(decoded)
除了age 始终为nil 之外,一切正常。这是有道理的。我的问题是如何在第一个示例中设置 Person 的年龄 = realage 或 28,在第二个示例中设置 nil。而不是age 在这两种情况下都是nil,我希望它在第一种情况下是28。
有没有办法只使用CodingKeys 而不必添加另一个结构或类来实现这一点?如果不是,我如何使用另一个结构或类以最简单的方式实现我想要的?
【问题讨论】:
-
你可以在里面写,自己编码。在那里你可以要求嵌套的年龄容器并相应地设置值。
-
@HAS 所以我刚刚在
Encode and Decode Manually和AdditionalInfoKeys上找到了this。但是我收到一个错误Designated initializer cannot be declared in an extension of 'Person'; did you mean this to be a convenience initializer?和Initializer requirement 'init(from:)' can only be satisfied by a 'required' initializer in the definition of non-final class 'Person' -
是的,你不能在扩展中这样做,你必须把它写在你声明类型的地方。