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