是否有一种容易出错的方法可以在相等比较期间从结构中排除某些属性,而无需编写我们自己的 == 函数?

Che*_*eng 1 ios swift

我们喜欢结构体的自动相等行为,只需简单地遵守Equatable协议即可。

有时,我们希望从结构相等性比较中排除某些属性。

目前,这是我们正在使用的方法。

struct House: Equatable {
    var field_0: String
    var field_1: String
    ...
    var field_50: String

    static func == (lhs: House, rhs: House) -> Bool {
        if lhs.field_0 != rhs.field_0 { return false }
        if lhs.field_1 != rhs.field_1 { return false }
        ...
        if lhs.field_48 != rhs.field_48 { return false }
        // Ommit field_49
        if lhs.field_50 != rhs.field_50 { return false }

        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这种方法很容易出错,特别是当我们在结构中添加新字段时。

有没有一种方法可以在不编写我们自己的 == 函数的情况下从相等比较中排除某些属性字段?

Ole*_*nov 9

实际上有一个使用 Swift Property Wrapper 功能的解决方案。这里有描述。

基本上你需要的是定义下一个属性包装器

@propertyWrapper
struct EquatableNoop<Value>: Equatable {
    var wrappedValue: Value

    static func == (lhs: EquatableNoop<Value>, rhs: EquatableNoop<Value>) -> Bool {
        true
    }
}
Run Code Online (Sandbox Code Playgroud)

并像下面一样使用它

struct Test: Equatable {
    var a: Int

    @EquatableNoop
    var b: () -> Void
}
Run Code Online (Sandbox Code Playgroud)