我想在不使用switch的情况下将枚举值与枚举类型进行比较。例如,以下代码使用AnimationFrame(){
mouseX = ( event.clientX - windowHalfX ) / resistanceh;
mouseY = ( event.clientY - windowHalfY ) / resistancew;
运算符:
~=
enum MyEnum {
case A, B
}
let myEnum = MyEnum.A
let isA = myEnum ~= MyEnum.A
等于isA
以上。
但是,当我尝试将枚举类型的枚举与关联值进行比较时,如下所示,我得到编译错误true
。
Binary operator '~=' cannot be applied to two MyEnum operands
有没有办法解决此错误以使用enum MyEnum {
case A, B(object: Any)
}
let myEnum = MyEnum.A
let isA = myEnum ~= MyEnum.A
模式匹配运算符?或者是我唯一可以使用以下语法的语言,我认为这种语法更加繁琐:
~=
提前感谢您的意见和建议!
答案 0 :(得分:2)
从Swift 1.2 的文档中,“枚举案例模式仅出现在switch
语句案例标签”中。所以是的,你需要定义你的~=
运算符(从注释中指出的答案)。
如果您只需要isA
和isB
,则可以使用switch
结合_
来实现它们。在您的情况下~=
无法使用开箱即用,因为您使用的Any
关联类型不是Equatable
(即:怎么能我说如果两个.B(any)
是相等的,因为我不能说两个是否相等?)
例如,以下是使用String
作为关联类型的代码的实现。如果您只需要isA
和isB
,则仍可以使用Any
作为关联类型,而无需实施~=
运算符。
enum MyEnum {
case A, B(object: String)
}
let myEnumA = MyEnum.A
let myEnumB = MyEnum.B(object: "Foo")
func ~=(lhs: MyEnum, rhs: MyEnum) -> Bool {
switch (lhs, rhs) {
case (.A, .A):
return true
case let (.B(left), .B(right)):
return left == right
default:
return false
}
}
myEnumA ~= .A // true
myEnumB ~= .B(object: "Foo") // true
myEnumB ~= .B(object: "Bar") // false
func isA(value: MyEnum) -> Bool {
switch value {
case .A:
return true
default:
return false
}
}
func isB(value: MyEnum) -> Bool {
switch value {
case .B(_): // Ignore the associated value
return true
default:
return false
}
}