问题描述
使用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
类型,以便以后进行算术运算。预先谢谢你!
解决方法
由于此类型完全由其值的组合定义,因此它是其自己的标识符。因此,只要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
。