Pet*_*rbo 3 equality set swift
我有一个符合 Hashable 的结构。该模型被放入一个Set. 当我随机检查该集合是否包含模型时,它会返回 true/false。为什么是这样?
enum Feature: String {
case a
case b
}
struct FeatureState: Hashable {
let feature: Feature
let isEnabled: Bool
}
extension FeatureState: Equatable {
static func == (lhs: FeatureState, rhs: FeatureState) -> Bool {
lhs.feature == rhs.feature
}
}
let fs1 = FeatureState(feature: .a, isEnabled: false)
let fs2 = FeatureState(feature: .a, isEnabled: true)
featureStates.insert(fs1)
print(featureStates.contains(fs2)) // sometimes true, sometimes false
Run Code Online (Sandbox Code Playgroud)
Set.contains使用哈希来检查元素是否已经是 的一部分,Set并且仅==在两个元素的哈希值相同时才使用运算符。因此,您需要提供自己的 hash(into:)实现来使哈希值仅依赖于feature,而不依赖于isEnabled。
struct FeatureState {
let feature: Feature
let isEnabled: Bool
}
extension FeatureState: Hashable {
static func == (lhs: FeatureState, rhs: FeatureState) -> Bool {
lhs.feature == rhs.feature
}
func hash(into hasher: inout Hasher) {
hasher.combine(feature)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |