てくのーと
525 文字
3 分

【Dart】enumからint変換を実現する

2022-09-20
2024-07-05

Dartでは、TypeScriptのように以下のようなenumの記述ができません。

enum PostStatus {
  unpublished = 0,
  published = 1,
  deleted = 2,
}

その代わりというわけではありませんが、dartではindexというものが利用できます。

enum PostStatus {
  unpublished,
  published,
  deleted,
}

final unpublishedIndex = PostStatus.unpublished.index; // 0
final publishedIndex = PostStatus.published.index; // 1
final deletedIndex = PostStatus.deleted.index; // 2

基本的には上記のindexを用いた方法で対応できていましたが、ある時enumのデータとデータベース内の数値を関連付けたい時がありました。
この場合indexだと、データベースの値がenumで指定した順に依存してしまうことになってしまいます。データベースの値にenumをあわせるには以下のような方法があります。

1. parameterを使う#

enumにはparameterを指定することができます。

enum PostStatus {
  unpublished(0),
  published(1),
  deleted(99)
  ;

  const PostStatus(this.id);
  final int id;
}

// 以下のようにすると、enumのidを取得できます。
void main() {
  print(PostStatus.deleted.id); // 99
}

2. メソッドを使う#

今回の場合、複雑な処理などが不要なので、parameterを使う方法で問題ないかと思います。
parameterを渡すだけでは表現できない場合には、メソッドを追加するのが有効です。
enumの種類が増えるたび、メソッドも変更する必要はありますが、enum内で閉じていることに加え、toIntメソッドだけ変更し忘れると、静的チェックでエラーになるのでまだ対応しやすいのではないかと思います。

enum PostStatus {
  unpublished,
  published,
  deleted,
  ;

    int toInt() {
        switch (this) {
        case PostStatus.unpublished:
            return 1;
        case PostStatus.published:
            return 2;
        case PostStatus.deleted:
            return 99;
        }
    }

    // Widgetを返すなどの、処理はメソッドで実装するのが良さそうです。
    Widget toWidget() {
    switch (this) {
      case PostStatus.unpublished:
        return Text('Unpublished', style: TextStyle(color: Colors.grey));
      case PostStatus.published:
        return Text('Published', style: TextStyle(color: Colors.green));
      case PostStatus.deleted:
        return Text('Deleted', style: TextStyle(color: Colors.red));
    }
  }
}

final postStatus = PostStatus.unpublished.toString(); // "unpublished"
final postStatus = PostStatus.unpublished.toInt(); // 0
final postStatus = PostStatus.deleted.toInt(); // 99

final widget = PostStatus.unpublished.toWidget(); // Text('Unpublished', style: TextStyle(color: Colors.grey))
\てくのーと おすすめ書籍!/

社会人はもとより、今情報Ⅰを学んでいる人が、なぜ学ぶのか、
学んだ内容をどう活かせるのか、を知るために読むのも良いと思います!
→感想詳細はこちら!