假设我有:
enum Type {
case A
case B
}
现在我可以比较它们:
let enums = [Type.A, Type.B]
if enums[1] == Type.A { //true }
一切都很好,除非我添加另一个具有相关值的案例:
case C(String)
现在我有一个错误:
二元运算符
==
不能应用于两个Type
操作数。
怎么做才能使它工作?
不幸的是,从Xcode 7 beta 4开始,你必须自己实现自己的==
函数,因为编译器不能再推断出相等的操作。特别是对于Type.C
:它还应该检查相关值的相等性吗?
逻辑/静态实现的示例:
// comparing associated values
func ==(t1: Type, t2: Type) -> Bool {
switch (t1, t2) {
case (.A, .A): return true
case (.B, .B): return true
case (.C(let x), .C(let y)) where x == y: return true
default: return false
}
}
// without comparing
func ==(t1: Type, t2: Type) -> Bool {
switch (t1, t2) {
case (.A, .A): return true
case (.B, .B): return true
case (.C, .C): return true
default: return false
}
}
一种更简单的方法是将其转换为String
(使用反射)。这将是一种动态的方法/解决方案,但它可能会随着时间而改变,特别是对于自己的类型(没有长期解决方案):
// you "have to" compare associated values
func ==(t1: Type, t2: Type) -> Bool {
return String(t1) == String(t2)
}
在Swift 4.2中很容易做到
enum SomeType: Equatable {
case a
case b
case c(String)
}
let enums = [SomeType.a, SomeType.b, SomeType.c("Some string")]
if enums[1] == SomeType.b { print("true") }
你必须为枚举类型实现func ==。 stackoverflow上有一些示例,向您展示如何使用每个案例的一行代码执行此操作。