如何使用两个枚举变量实现 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
协议。我如何将其身份实现为其 suit
和 rank
(仅创建一次)的唯一组合?本质上,它的标识可以是 '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
。
使用 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
(仅创建一次)的唯一组合?本质上,它的标识可以是 '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
。