Как реализовать Identifiable с помощью двух переменных перечисления

Используя Swift 5.3, как я могу реализовать Identifiable протокол для структуры, поскольку ее идентичность зависит от комбинации двух переменных перечисления?

Рассматриваемый код прост,

struct Card: Identifiable {
    let suit: Suit
    let rank: Rank
    
    enum Suit {
        case spades, clubs, diamonds, hearts
    }
    
    enum Rank: Int {
        case one = 1, two, three, four, five, six, seven, jack, queen, king
    }
}

Вышеуказанная структура не соответствует Identifiableпротокола пока нет. Как я могу реализовать его идентичность как уникальное сочетание егоsuit а также rank(которые создаются только один раз)? По сути, это может быть "пика-1" или "бубновый валет". Кроме того, если возможно, я хотел бы сохранитьrank как Intтип, чтобы учесть арифметические операции позже. Заранее спасибо!

2 ответа

Решение

Поскольку этот тип точно определяется комбинацией его значений, это его собственный идентификатор. Итак, пока Card является Hashable, она может идентифицировать себя:

extension Card: Hashable, Identifiable {
    var id: Self { self }
}

Соответствовать Suit к String и объедините их, чтобы создать уникальный идентификатор String.

struct Card: Identifiable {

    var id: String { "\(suit.rawValue)\(rank.rawValue)" }

    let suit: Suit
    let rank: Rank

    enum Suit: String {
        case spades, clubs, diamonds, hearts
    }
    enum Rank: Int {
        case one = 1, two, three, four, five, six, seven, jack, queen, king
    }
}

Внимание: это не может быть обобщено для каждого сценария. Хотя в данном конкретном случае это работает нормально. Поскольку мы используем конкатенацию двух строк вместе для вычисленияid из Cardобъект.

Другие вопросы по тегам