我有一个称为Requirements
的基本模型和另一个更具体的称为AccountRequirements
的模型。
当我尝试读取currentDeadline
属性时,如果我使用Requirements
,它可以正常工作。如果我使用AccountRequirements
,它会显示为nil
。
我不明白为什么。我猜这与class
有关。我总是在我的模型中使用struct
,但由于我不能从struct
继承,所以我在这里使用class
。
class Requirements: Codable {
var commonProperty: String
// works
var currentDeadline: Int?
enum CodingKeys: String, CodingKey {
case commonProperty = "common_property"
case currentDeadline = "current_deadline"
}
}
class AccountRequirements: Requirements {
// doesnt work
var currentDeadline: Int?
enum CodingKeys: String, CodingKey {
case currentDeadline = "current_deadline"
}
}
我这样解码数据:
documentReference.addSnapshotListener { [self] documentSnapshot, error in
guard let document = documentSnapshot else {
self.error = error!.localizedDescription
return
}
self.user = try? document.data(as: Requirements.self)
}
如果您想将其解码为子类,那么您需要将该类而不是超类赋予document.data(as:)
。您还需要为子类实现init(from:)
以正确解码
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
currentDeadline = try container.decodeIfPresent(Int.self, forKey: .currentDeadline)
try super.init(from: decoder)
}
下面是一个带有硬编码json值的示例
let data = """
{ "common_property": "Some text",
"current_deadline": 42
}
""".data(using: .utf8)!
do {
let result = try JSONDecoder().decode(Requirements.self, from: data)
print(type(of: result), result.commonProperty)
let result2 = try JSONDecoder().decode(AccountRequirements.self, from: data)
print(type(of: result2), result2.commonProperty, result2.currentDeadline ?? "")
} catch {
print(error)
}
要求某些文本
AccountRequirements某些文本42