У меня есть класс Process с параметром типа Step (Step является «абстрактным»). У меня есть два класса типа Step: StepSign и StepReview, как показано в коде:
class Process: Codable {
let steps: Array<Step>
let actualStep: Step
private enum CodingKeys: String, CodingKey {
case steps, actualStep
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
steps = try container.decode(Array<Step>.self, forKey: .steps)
actualStep = try container.decode(Step.self, forKey: .actualStep)
}
}
class Step: Codable {
var id : Int?
}
class StepSign : Step {
var name : String?
private enum CodingKeys: String, CodingKey {
case name
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
try super.init(from: decoder)
}
}
class StepReview: Step {
var isReview: Bool
private enum CodingKeys: String, CodingKey {
case isReview
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
isReview = try container.decode(Bool.self, forKey: .isReview)
try super.init(from: decoder)
}
Когда я пытаюсь декодировать, я получаю Step, но мне бы хотелось, чтобы он возвращал StepSign или StepReview. Но я не знаю, как указать, какой это тип, поскольку во время декодирования я не знаю.
Проблема, с которой я столкнулся, заключается в следующих строках:
steps = try container.decode(Array<Step>.self, forKey: .steps)
actualStep = try container.decode(Step.self, forKey: .actualStep)
Есть идеи?