Swift模型未从Firestore读取数据



我有一个称为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

最新更新