0

我不知道这是一个错误还是一个功能,但枚举的排序数组每次运行都会产生不同的结果。这是测试它的基本代码。

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 {$0.rawValue})
4

2 回答 2

2

简单的答案:

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

您正在寻找的答案:

不要根据它们的哈希对字符串(或任何类型)进行排序,这不是你要找的。你要找的是这个

您想要的实现可能是这样的:

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

rawValue是枚举的原始String值。

哈希值是哈希函数的乘积,与排序完全无关。

奖金信息:

对于那些想知道为什么每次 Swift 运行的哈希值都不同的精明观察者,这里是细分。

于 2019-03-28T19:47:01.347 回答
1

很确定是因为这个

不保证哈希值在程序的不同执行中是相等的。不要保存哈希值以供将来执行期间使用。

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

return lhs.rawValue < rhs.rawValue

那应该工作。

于 2019-03-28T19:52:36.833 回答