Как реализовать 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
объект.