2
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 項演算子 '==' を使用できません...」)、またはそれが何を意味するのかはまだわかりません。

4

2 に答える 2

2
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()
于 2015-11-06T06:16:28.243 に答える