复杂枚举类型的 Equatable 协议实现

swift 语言中的枚举类型和大部分语言的枚举型非常的不同,它不仅仅提供了枚举值,甚至可以提供枚举类型的方法函数。同时,还可以在具体的枚举值上增加同类枚举的不同枚举内部变量值。而作为一个基础类型的扩展,如何实现此类复杂枚举类型的 Equatable 协议呢?

复杂枚举

例如,有这样一个稍微复杂的枚举类型:

enum Barcode {
    case UPCA(Int, Int)
    case QRCode(String)
    case None
}

如果想要判断 Barcode.QRCode("1111") == Barcode.QRCode("1111") 是否相等,编辑器会提示错误信息,标示该类型无法进行等值判断。

等值判断

为了进行等值判断,类型必须满足 Equatable 协议实现。

extension Barcode: Equatable {
}

func ==(lhs: Barcode, rhs: Barcode) -> Bool {
    switch (lhs, rhs) {
    case (let .UPCA(codeA1, codeB1), let .UPCA(codeA2, codeB2)):
        return codeA1 == codeA2 && codeB1 == codeB2

    case (let .QRCode(code1), let .QRCode(code2)):
        return code1 == code2

    case (.None, .None):
        return true

    default:
        return false
    }
}

现在,就可以开始枚举类型的等值判断了

Barcode.QRCode("code") == Barcode.QRCode("code") // true
Barcode.UPCA(1234, 1234) == Barcode.UPCA(4567, 7890) // false
Barcode.None == Barcode.None // true

None None

评论