4

使用 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类型,以便以后进行算术运算。先感谢您!

4

2 回答 2

11

由于这种类型是由其值的组合精确定义的,因此它是它自己的标识符。所以只要 Card 是 Hashable 的,它就可以识别自己:

extension Card: Hashable, Identifiable {
    var id: Self { self }
}
于 2020-08-17T18:50:11.057 回答
0

符合SuitString组合它们以创建唯一标识符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对象的。

于 2020-08-17T18:50:16.157 回答