为什么使用 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})
简单的答案:
在您的示例中,您正在使用 String
的 hashValue
进行比较。 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
应该可以。
我不知道这是错误还是功能,但对枚举数组进行排序会给出不同的结果 运行。这是测试它的基本代码。
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})
简单的答案:
在您的示例中,您正在使用 String
的 hashValue
进行比较。 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
应该可以。