Запрещение некоторых конкретных c случаев косвенного перечисления в swift - PullRequest
0 голосов
/ 12 февраля 2020

Как я могу гарантировать, что некоторые косвенные случаи моего перечисления запрещены?

Например, вот мой тип:

enum PerkCard : Hashable {
    case add(Int)
    case mult(Int)
    indirect case roll(PerkCard)
}

Я могу создавать экземпляры случаев, но некоторые должны не допускается (у вас не может быть рулонных карточек)

let c1 = PerkCard.add(1)
let c2 = PerkCard.roll(.add(1))
let c3 = PerkCard.roll(.roll(.add(1))) // Forbidden

Я не вижу способа предотвратить это при создании. Это просто возможно?

Заранее спасибо.

PS: Я знаю, что могу добавить метод check, который бы справился с этой задачей, но это не вопрос .

PPS: Я также знаю, что могу разработать этот пример с таким типом struct

struct PerkCard : Hashable {
    let value : Int
    let kind : Kind
    let roll : Bool

    enum Kind {
        case add, mult
    }
}

Но это не главное.

1 Ответ

0 голосов
/ 12 февраля 2020

Я не думаю, что Swift поддерживает полиморф c или расширяемые перечисления, или ограниченный подтип.

Так что я бы сделал это, разделив перечисление на две части вместо рекурсивного перечисления:

enum A {
    case add(Int)
    case mult(Int)
}
enum B {
    case a(A)
    case roll(A)
}

это немного менее удобно в некотором смысле (поскольку вы должны написать .a(.add(5)) вместо просто .add(5)), но достаточно просто создать простых помощников для генерации значений add и mult.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...