【Flutter/Dart】列挙型の使い方|Enum

Enum
目次

Enum(列挙型)とは?

Enum

結論

Enumを使えば、関連のある複数の定数にそれぞれ名前を付け、1つのデータの固まりとして定数を使用できます。また宣言した定数順にindexが0から上順に振り分けられます。

メリット・どんな時に使うのか?

Enumを使用することで、コードを読みやすくすることができます。まずは次の2つのコードを見比べてみて見てください。どちらも実行するプログラムは同じですが、Enumを使用したコードの方がパッと見、理解しやすいはずです。

Enumを使用した場合

void main() {
  Move move = Move(Direction.left);
  move.walk(); 
  //「左方向へ歩く」が出力
}

class Move{
  Direction direction;
  Move(this.direction){}
  
  void walk(){
    switch(direction){
      case Direction.left:
        print('左方向へ歩く');
        break;
      case Direction.top:
        print('前方へ歩く');
        break;
      case Direction.right:
        print('右方向へ歩く');
        break;
      case Direction.bottom:
        print('後方へ歩く');
        break;
// 定数だからタイプミスがない、代わりにコンパイルエラーが起きる
// default不要
    }
  }
}

enum Direction{
  left,
  top,
  right,
  bottom
}

Enumを使用しない場合

void main() {
  Move move = Move(0);
  move.walk();
  //「左方向へ歩く」が出力
}

class Move{
  int direction;
  Move(this.direction){}
  
  void walk(){
    switch(direction){
      case 0:
        print('左方向へ歩く');
        break;
      case 1:
        print('前方へ歩く');
        break;
      case 2:
        print('右方向へ歩く');
        break;
      case 3:
        print('後方へ歩く');
        break;
// 変数だからタイプミスがある
// default必要
      default:
        print('歩かない');
        break;
    }
  }
}

Enumを使用したコードでは、クラスのコンストラクタ、メソッドのswich文で、Enumで定義した定数を使用しています。よって直感的に何の目的でコードを書いているのか理解できます。また、Enumは定数なのでタイプミスの心配がありません。一方でEnumを使用しないコードでは、int型の変数を使ってswitch文を使用しているので一見では理解しづらい上、変数ゆえにタイプミスの可能性があります。

Enumは今回の例のswitch文のように、関連のある複数の定数を使用する際に好んで使われます。チームでアプリ開発をする際などにもEnumを使うことで情報共有がしやすくなります。

>>【Dart】条件分岐の使い方|if/switch/三項演算子

Enumの定義

enum 列挙名{
  定数名A,
  定数名B,
  定数名C
}
//例
enum Direction{
  left,
  top,
  right,
  bottom
}

上のようにEnumをmain()またはクラスの外で定義します。

Enumの宣言

列挙名 オブジェクト名;
列挙名 オブジェクト名 = 列挙名.定数名;
//例
Direction direction;
Direction direction = Direction.left;

Enumは変数と同じように宣言します。

>>【Dart】static変数とdynamic変数の使い方|型と宣言

Enumの値を取得

列挙名.定数名.index; // 指定した定数のindexを取得
列挙名.values; // Enumで定義した全ての定数を取得
列挙名.values[index]; // indexの定数を取得
//例
void main() {
print(Direction.left.index); // 0
print(Direction.values); // [Direction.left, Direction.top, Direction.right, Direction.bottom]
print(Direction.values[0]); // Direction.left
}

enum Direction{
  left,
  top,
  right,
  bottom
}

上のようにEnumの定数名またはindexを取得します。

よかったらシェアしてね!
目次
閉じる