我可以使用模式匹配运算符 ~= 将枚举值与具有关联变量的枚举类型匹配吗?
Can I use the pattern matching operator ~= to match an enum value to an enum type with an associated variable?
我想在不使用 switch 的情况下将枚举值与枚举类型进行比较。例如,以下代码使用 ~=
运算符:
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
有没有办法解决此错误以使用 ~=
模式匹配运算符?或者我唯一的办法是使用以下语法,在我看来这要麻烦得多:
enum MyEnum {
case A, B(object: Any)
}
let myEnum = MyEnum.A
let isA: Bool
switch myEnum {
case .A:
isA = true
default:
isA = false
}
提前感谢您的意见和建议!
来自 Swift 1.2 "Enumeration case patterns appear only in switch
statement case labels" 的文档。所以是的,您需要定义 ~=
运算符(根据评论中指出的答案)。
如果您只需要 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
}
}
我想在不使用 switch 的情况下将枚举值与枚举类型进行比较。例如,以下代码使用 ~=
运算符:
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
有没有办法解决此错误以使用 ~=
模式匹配运算符?或者我唯一的办法是使用以下语法,在我看来这要麻烦得多:
enum MyEnum {
case A, B(object: Any)
}
let myEnum = MyEnum.A
let isA: Bool
switch myEnum {
case .A:
isA = true
default:
isA = false
}
提前感谢您的意见和建议!
来自 Swift 1.2 "Enumeration case patterns appear only in switch
statement case labels" 的文档。所以是的,您需要定义 ~=
运算符(根据评论中指出的答案)。
如果您只需要 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
}
}