我们喜欢结构体的自动相等行为,只需简单地遵守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)
但是,这种方法很容易出错,特别是当我们在结构中添加新字段时。
有没有一种方法可以在不编写我们自己的 == 函数的情况下从相等比较中排除某些属性字段?
实际上有一个使用 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)
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |