iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

Kotlin の Enum を使ってみる

みなさん Kotlin は書いていますか?僕は、最近仕事の合間などに少しずつ書くようにしています🧑‍🔧

今回はそんな、Kotlin の enum(列挙型) の基本的な使い方をみていきたいと思います。 余談ですが、毎日技術ブログを書いていると常時ネタ不足に陥るので、 iOS/Android 関連で面白そうなネタがあれば教えてください😇

それではやっていく

Kotlin の enum の宣言は、こんな感じです。また、各定数(SOCCER, TENNIS, BASEBALL など)は、オブジェクトとして扱われるそうです。公式ドキュメントやその他 Kotlin のプリミティブの実装をみた感じだと enum の各定数は Upper snake case で宣言するのがデファクトスタンダートになっている感じでしょうか🤔

    enum class Sport {
        SOCCER, TENNIS, BASEBALL
    }

そして、enum を評価した例が下記になります。

    when (type) {
        Sport.SOCCER -> Log.i("HOGE", "SOCCER")
        Sport.TENNIS -> Log.i("HOGE", "TENNIS")
        Sport.BASEBALL -> Log.i("HOGE", "BASEBALL")
        else -> {
            throw AssertionError("no enum found for the id. you forgot to implement?")
        }
    }

Swift の enum みたいに Associated value を追加することはできる?

結論 Swift ほど柔軟に値を付与することはできません。が、それぞれの定数に同じ型の変数または、メンバプロパティ・メソッドを付与することはできます。

変数を保持させる場合:

    enum class Sport(val id: Int) {
        SOCCER(1), TENNIS(2), BASEBALL(3)
    }

メンバプロパティ・メソッドをそれぞれの定数に付与する場合:

    enum class Sport {
        SOCCER {
            override val id: Int
                get() = 1
        },
        TENNIS {
            override val id: Int
                get() = 2
        },
        BASEBALL {
            override val id: Int
                get() = 3
        };
        
        abstract val id: Int
    }

abstract は、メンバのメソッド・プロパティをサブクラスなどに強制させるための修飾子で、これにより Sport の各定数は、id プロパティをオーバライドできるようになります。ちなみに Swift では、これらは enum のメンバ変数として下記のように定義できます。

    enum Sport {
        case soccer
        case tennis
        case baseball

        var id: Int {
            switch self {
            case .soccer: 1
            case .tennis: 2
            case .baseball: 3
            }
        }
    }

そんな感じで今回は以上になります👷‍♀️ また、勉強がてら Kotlin の記事を書こうと思います。それでは、また明日🎣

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com