如何使用两个枚举变量实现 Identifiable

How to implement Identifiable using two enum variables

使用 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协议。我如何将其身份实现为其 suitrank(仅创建一次)的唯一组合?本质上,它的标识可以是 'spades-1' 或 'diamonds-jack'。此外,如果可能的话,我想将 rank 保留为 Int 类型,以便以后进行算术运算。提前致谢!

由于这种类型正是由其值的组合定义的,因此它是它自己的标识符。所以只要 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
    }
}

注意:这不能适用于所有情况。虽然这在这个特定的地方工作得很好。因为我们使用两个字符串的串联来计算 Card 对象的 id