Swift--Equable

2017-03-28  本文已影响51人  anddygon

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

上一篇下一篇

猜你喜欢

热点阅读