美文网首页
Swift--Equable

Swift--Equable

作者: anddygon | 来源:发表于2017-03-28 23:55 被阅读51次

    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

    相关文章

      网友评论

          本文标题:Swift--Equable

          本文链接:https://www.haomeiwen.com/subject/gjwsottx.html