9

この記事は最終更新日から1年以上が経過しています。

投稿日

Organization

DartのEnumが使いにくかった話

DartのEnumは使いにく

僕はKotlinでのAndroidアプリ開発を生業としているのですが、最近はFlutterがマイブームで、Kotlinよりも触っている時間が長くなりつつあります。
僕はAndroidアプリの開発で、Enumの値に値を持たせる手法をよく使うのですが、Flutterでもそのような実装をしたいなあと思った時があり、特にググったりせずにとりあえず書いてみました。

convenience_store.dart
enum ConvenienceStore(String name){
    SEVENELEVEN('セブンイレブン'),
    LAWSON('ローソン'),
    FAMILYMART('ファミリーマート')
    // 省略
}

Kotlinの知識から、Dartもこんな感じかなあというノリだったのですが、見事に撃沈。
;が期待されちゃってます...

それじゃあEnumの値に値を持たせるのってどうやるの?ということでいろいろ探してみたら、 extension メソッドを使えばそれっぽくなるらしいのでやってみました。

convenience_store.dart
enum ConvenienceStore{
    SEVENELEVEN,
    LAWSON,
    FAMILYMART
    // 省略
}

extension ConvenienceStoreExt on ConvenienceStore{
  String get name {
      switch(this){
        case ConvenienceStore.SEVENELEVEN:
          return 'セブンイレブン';
          break;
        case ConvenienceStore.LAWSON:
          return 'ローソン';
          break;
        case ConvenienceStore.FAMILYMART:
          return 'ファミリーマート';
          break;
        }
        // 省略
    }
}

ひとまず怒られることはなくなりましたが、なんだか記述量が半端なく多いですね...
それはさておき、nameメソッドにアクセスできるようになりました!

print(ConvenienceStoreExt.SEVENELEVEN.name) // 'セブンイレブン'と表示される

おまけ

Kotlinで同様のEnumを定義するとこのように書けます。

enum class ConvenienceStore(name: String) {
    SEVENELEVEN("セブンイレブン"),
    LAWSON("ローソン"),
    FAMILYMART("ファミリーマート")
}

うん、実家のような安心感。

感想

DartのEnumの発展を願っております。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について
AtsushiUemura
Android & Flutter Dev with Design.
yumemi
みんな知ってるあのサービスも、ゆめみが一緒に作ってます。スマホアプリ/Webサービスの企画・UX/UI設計、開発運用の内製化支援。Swift,Kotlin,Rust,Go,Flutter,ML,React,AWS等エンジニア・クリエイターの会社です。Twitterで情報配信中https://twitter.com/yumemiinc

コメント

(編集済み)

既にご存知かもしれませんが、外部パッケージの freezed を使うと sealed class 的なものを実装できるので、
Kotlin的な書き方が出来るようになると思います。
https://github.com/rrousselGit/freezed

1

@m-coder

freezed を使うと sealed class 的なものを実装できる

あったんですね!
教えていただきありがとうございます😊

1

2.15でenumが拡張される予定のようですね。
sdk/CHANGELOG.md at main · dart-lang/sdk

まだ任意の文字列が返せるようにはなりません。

0
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
9