【发布时间】:2016-02-07 04:41:21
【问题描述】:
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-statement 版本(将强制解包属性与固定枚举大小写进行比较)正在编译,没有错误。
我只能得出结论,这与解析器中的一些损坏的缓存有关,这些缓存在此过程中被清除了。
EDIT 2(感谢@LeoDabus 和@MartinR):当我将关联值设置为 other 枚举案例(不是我我比较 - 在这种情况下,.SecondCase)。我仍然不明白为什么会特别触发这个编译器错误(“不能使用二元运算符'=='...”),或者这意味着什么。
【问题讨论】:
-
您忘记初始化状态并且您正在强制解开它。添加保护让状态=状态其他{返回}而不是
-
这是类型和变量名已更改的虚拟代码,大部分方法被省略。在我的真实代码中,var is 已初始化。无论哪种情况,这最多应该是一个运行时问题。其实我在测试
viewDidLoad()里面的值,编译器不知道有没有初始化。 -
您使用的是哪个 Xcode 版本?我在这里没有收到此错误
-
那是你的真实代码吗?正如 Leo 所说,它在 Xcode 7 和 7.1 中编译没有问题。 – 也许你有一个带有关联值的枚举?
-
@NicolasMiari:另一种选择是让您的枚举符合
Equatable,如下所示:stackoverflow.com/a/25726677/59541
标签: swift if-statement enums binary-operators