class MyClass
{
enum MyEnum {
case FirstCase
case SecondCase(Int)
case ThirdCase
}
var state:MyEnum!
func myMethod ()
{
if state! == MyEnum.FirstCase {
// Do something
}
}
}
ifステートメントを指すコンパイラ エラーが発生します::
二項演算子 '==' は 2 つの '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ステートメントは冗長すぎるように感じます。I just want to do somethingfor .FirstCase, and nothing other. 声明はより理にifかなっています。
列挙型と で何が起こっているの==ですか?
編集:これは非常に奇妙です。switchバージョンを決定し、コードの他の (まったく関係のない) 部分に移動して戻ってきた後、-statementifバージョン (強制的にラップ解除されたプロパティと固定された列挙型のケースを比較) はエラーなしでコンパイルされます。途中でクリアされたパーサーの破損したキャッシュと関係があるとしか結論付けられません。
EDIT 2(@LeoDabusと@MartinRに感謝):関連付けられた値を他の列挙型ケース(比較しているものではなく、この場合は.SecondCase)に設定するとエラーが表示されるようです。特にこのコンパイラ エラーが発生する理由 (「2 項演算子 '==' を使用できません...」)、またはそれが何を意味するのかはまだわかりません。