为什么使用 Swift 5 对枚举数组进行排序会给出不同的结果?

Why does sorting array of enums with Swift 5 give different results?

我不知道这是错误还是功能,但对枚举数组进行排序会给出不同的结果 运行。这是测试它的基本代码。

enum Tag: String {
    case bold, italic, underline
}

extension Tag: Comparable {
    static func <(lhs: Tag, rhs: Tag) -> Bool {
        return lhs.hashValue < rhs.hashValue
    }
}

let tags:[Tag] = [.bold, .italic, .underline].sorted()
print(tags.map {[=11=].rawValue})

简单的答案:

在您的示例中,您正在使用 StringhashValue 进行比较。 Swift 5 的哈希算法与 Swift 4 的不同。

您要找的答案:

不要根据散列值对字符串(或与此相关的任何类型)进行排序,这不是您要查找的内容。您要查找的是 this.

你想要的实现大概是这样的:

extension Tag: Comparable {
    static func <(lhs: Tag, rhs: Tag) -> Bool {
        return lhs.rawValue < rhs.rawValue
    }
}

rawValue 是枚举的原始 String 值。

哈希值是hash function的乘积,与排序完全无关

奖金信息:

对于那些想知道为什么散列值每个 Swift 运行 不同的敏锐观察者来说,here 是细分。

很确定是因为 this:

Hash values are not guaranteed to be equal across different executions of your program. Do not save hash values to use during a future execution.

如果您将比较方法更改为:

return lhs.rawValue < rhs.rawValue

应该可以。