在查看一些代码时,我发现一个实现为的Rank
枚举:
enum Rank: String {
case first
case second
case third
}
但是,对我来说,令人惊讶的部分是我看到了与此类似的代码:
let gold = [300, 200, 100]
let firstPrize = gold[Rank.first.hashValue] // 300
意味着Rank.first.hashValue
已被用作索引!乍一看,使用哈希值作为数组的索引似乎不是一个好主意:
在不同的执行中,哈希值不能保证相等 您的程序。不要保存哈希值以备将来使用 执行。
尽管如此,它永远不会引起问题(至少他们所说的那样)。
我尝试通过实施以下方法来跟踪问题:
print(Rank.first.hashValue) // 0
print(Rank.second.hashValue) // 1
print(Rank.third.hashValue) // 2
我看到的是输出总是相同的。
尽管我们可以在枚举中声明一个属性来执行此功能,例如:
var index: Int {
switch self {
case .first:
return 0
case .second:
return 1
case .third:
return 2
}
}
因此:
let firstPrize = gold[Rank.first.index] // 300
我想知道为什么在这种情况下使用hashValue
似乎可以吗?可能与以下内容有关:我误解了hashValue
的确切含义是什么?