Swift 设置相等有时为真有时为假

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)

Dáv*_*tor 5

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)