在枚举情况下依靠hashValue是否明智?

时间:2018-07-10 13:38:53

标签: swift hash enums

在查看一些代码时,我发现一个实现为的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已被用作索引!乍一看,使用哈希值作为数组的索引似乎不是一个好主意:

  

在不同的执行中,哈希值不能保证相等   您的程序。不要保存哈希值以备将来使用   执行。

     

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的确切含义是什么?

0 个答案:

没有答案