Декодирование быстрых данных наследования - PullRequest
0 голосов
/ 12 марта 2020

У меня есть класс 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)

Есть идеи?

...