swift的equable的实现很简单只要实现func ==(lhs: ..., rhs: ...)
但是我们一般对类型添加属性的时候就需要记得去重新实现一下equable,否则程序很可能就因为添加了属性出现了一些错误,检查出这个错误还需要一些时间。
1.比如enum
enum Test {
case enum1(String)
case enum2(Int)
}
extension Test: Equatable {
static func == (lhs: Test, rhs: Test) -> Bool {
switch (lhs, rhs) {
case let (.enum1(lStr), .enum1(rStr)):
return lStr == rStr
case let (.enum2(li), .enum2(ri)):
return li == ri
default:
return false
}
}
}
没问题,很简单。 但是当你又添加了一个case,这个时候你忘记修改equable的实现,又因为实现里面有default,一切编译正常,就是结果可能不对,最后调试很久发现问题是equable实现有问题,才想起来没修改equable。
所以,有没有一种办法,让我们添加case的时候编译器能提示我们可能需要修改equable实现呢,有!!!
那么问题既然出现在default,那我们怎么避免掉这个default呢,这样做
enum Test {
case enum1(String)
case enum2(Int)
}
extension Test: Equatable {
static func == (lhs: Test, rhs: Test) -> Bool {
switch (lhs, rhs) {
case let (.enum1(lStr), .enum1(rStr)):
return lStr == rStr
case let (.enum2(li), .enum2(ri)):
return li == ri
case (.enum1, _), (.enum2, _):
return false
}
}
}
现在当我们添加新的case,编译器就会报错,因为我们没有穷举完所有情况。
所以当我们写程序的时候碰到枚举的时候能避免写default就要避免。
2.类,结构体的equable
类和结构体同样有这样的问题,添加属性的时候也会很容易忘掉修改equable实现,同意编译器不会检查出来,这种情况处理比enum更复杂一些,参照http://swift.gg/2017/03/28/dump-as-equatable-safeguard/#more