class MyClass
{
enum MyEnum {
case FirstCase
case SecondCase(Int)
case ThirdCase
}
var state:MyEnum!
func myMethod ()
{
if state! == MyEnum.FirstCase {
// Do something
}
}
}
我收到指向if
语句::
二元运算符'=='不能应用于两个'MyClass.MyEnum' 操作数
相反,如果我使用switch
语句,则没有问题:
switch state! {
// Also, why do I need `!` if state is already an
// implicitly unwrapped optional? Is it because optionals also
// are internally enums, and the compiler gets confused?
case .FirstCase:
// do something...
default:
// (do nothing)
break
}
然而,switch
声明过于冗长:我只想do something
.FirstCase
,而不是if
。 ==
语句更有意义。
枚举和switch
会发生什么?
编辑:这太奇怪了。在解决了if
版本并转移到我的代码的其他(完全无关的)部分并返回之后,select id from branches where branch_name=?
- 语句版本(针对固定枚举情况的合并强制解包属性)正在编译没有错误。
我只能得出结论,它与解析器中的一些已损坏的缓存有关,并且在此过程中已被清除。
编辑2 (感谢@LeoDabus和@MartinR):当我为其他枚举案例设置相关值时,似乎出现错误(不是我我正在比较 - 在这种情况下,.SecondCase)。我仍然不明白为什么会特别触发此编译器错误(“不能使用二元运算符'=='...”),或者这意味着什么。
答案 0 :(得分:7)
正如您在评论中所说,您的枚举类型实际上已关联
值。在这种情况下,枚举类型没有默认的==
运算符。
但是你甚至可以在if
语句中使用模式匹配(自Swift 2起):
class MyClass {
enum MyEnum {
case FirstCase
case SecondCase
case ThirdCase(Int)
}
var state:MyEnum!
func myMethod () {
if case .FirstCase? = state {
}
}
}
此处.FirstCase?
是.Some(MyEnum.FirstCase)
的快捷方式。
在您的switch语句中,state
不会自动解包,
即使它是一个隐含的未包装的可选项(否则你可以
与nil
不匹配。但是这里可以使用相同的模式:
switch state {
case .FirstCase?:
// do something...
default:
break
}
更新:从 Swift 4.1 (Xcode 9.3)开始,编译器可以为具有关联值的枚举合成Equatable / Hashable的一致性(如果它们的所有类型都是Equatable / Hashable )。宣布一致性就足够了:
class MyClass {
enum MyEnum: Equatable {
case firstCase
case secondCase
case thirdCase(Int)
}
var state:MyEnum!
func myMethod () {
if state == .firstCase {
// ...
}
}
}
答案 1 :(得分:1)
class MyClass {
enum MyEnum {
case FirstCase
case SecondCase
case ThirdCase
}
var state: MyEnum!
func myMethod() {
guard
let state = state else { return }
if state == MyEnum.FirstCase {
// Do something
print(true)
} else {
print(false)
}
}
}
let myClass = MyClass()
myClass.state = .FirstCase
myClass.myMethod()
myClass.state = .SecondCase
myClass.myMethod()