如何使用两个枚举变量实现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协议。如何将其身份实现为suitrank(仅创建一次)的唯一组合?从本质上讲,它的身份可以是“锹1”或“钻石杰克”。此外,如果可能的话,我想将rank保留为Int类型,以便以后进行算术运算。预先谢谢你!

解决方法

由于此类型完全由其值的组合定义,因此它是其自己的标识符。因此,只要Card是可哈希的,它就可以标识自己:

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