みなさん 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 の記事を書こうと思います。それでは、また明日🎣
参考
- https://kotlinlang.org/docs/reference/enum-classes.html
- https://discuss.kotlinlang.org/t/enum-constants-uppercase-or-camecase/13984/8
- https://qiita.com/toastkidjp/items/b7913ba398091c4c55a4