プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

DartのHashSetからenumの名前をキーにしたMapを作成する

この記事は 2026 年 8 月 13 日に投稿しました。

目次

  1. はじめに
  2. DartのHashSetからenumの名前をキーにしたMapを作成する
  3. 作成したMapからenum値を取得する
  4. asNameMapメソッドを使用する場合の注意点
  5. byNameメソッドとの違い
  6. おわりに

1. はじめに

こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。 2018年5月から毎日技術ブログを更新しています。

今回はDartHashSetから、enumの名前をキーにしたMapを作成するasNameMapメソッドについてです。

目次へ

2. DartのHashSetからenumの名前をキーにしたMapを作成する

DartHashSetにenum値を格納している場合、asNameMapメソッドを使用すると、enumの名前をキーにしたMapを作成できます。

asNameMapメソッドの形式は以下になります。

Map<String, T> asNameMap()

戻り値は、enum値のnameをキー、enum値そのものを値とするMap<String, T>です。

例えば、次のようなenumを定義します。

enum Color {
  red,
  green,
  blue,
}

このenum値を格納したHashSetに対してasNameMapメソッドを使用する場合は、次のようになります。

実装例

import 'dart:collection';

enum Color {
  red,
  green,
  blue,
}

void main() {
  final set = HashSet<Color>();

  set.addAll([
    Color.red,
    Color.green,
    Color.blue,
  ]);

  final map = set.asNameMap();

  print(map);
}

実行すると、enum値の名前をキーにしたMapが作成されます。

例えば、作成されるMapの内容は次のようになります。

{
  'red': Color.red,
  'green': Color.green,
  'blue': Color.blue,
}

Color.redの場合、enum値のnameredなので、

'red': Color.red

というキーと値の組み合わせになります。

同様に、

Color.green
Color.blue

からは、それぞれgreenblueをキーとする要素が作成されます。

このようにasNameMapメソッドを使用すると、enum値の集合を、名前からenum値を取得できるMapに変換できます。

なお、HashSetは要素の順序を保証しません。

そのため、作成されるMapの要素の並び順を前提とした処理は避けた方がよさそうです。

目次へ

3. 作成したMapからenum値を取得する

asNameMapメソッドで作成したMapでは、enumの名前を文字列で指定してenum値を取得できます。

例えば、先ほどのColorを使用してgreenに対応するenum値を取得する場合は次のようになります。

import 'dart:collection';

enum Color {
  red,
  green,
  blue,
}

void main() {
  final set = HashSet<Color>();

  set.addAll([
    Color.red,
    Color.green,
    Color.blue,
  ]);

  final map = set.asNameMap();

  final color = map['green'];

  print(color);
}

実行結果

Color.green

asNameMapメソッドによって、

'green': Color.green

という要素が作成されているため、

map['green']

とすることでColor.greenを取得できます。

存在しない名前を指定した場合はnullが返されます。

例えば、

final color = map['yellow'];

print(color);

とした場合の実行結果は次のようになります。

null

そのため、外部から受け取った文字列などをenum値に変換したい場合にも利用できます。

例えば、次のように記述できます。

final name = 'blue';
final color = map[name];

if (color != null) {
  print('enum値: $color');
} else {
  print('該当するenum値がありません');
}

このように、asNameMapメソッドであらかじめMapを作成しておけば、enumの名前をキーとしてenum値を取得できます。

目次へ

4. asNameMapメソッドを使用する場合の注意点

asNameMapメソッドは、どのような型のHashSetでも使用できるわけではありません。

asNameMapメソッドは、enum値を格納したIterableで利用できるEnumByName拡張によって提供されています。

そのため、例えば次のようなHashSet<String>に対して使用することはできません。

final set = HashSet<String>();

set.addAll([
  'red',
  'green',
  'blue',
]);

final map = set.asNameMap(); // 使用できない

asNameMapメソッドを使用する場合は、次のようにenumを要素とする必要があります。

final set = HashSet<Color>();

set.addAll([
  Color.red,
  Color.green,
  Color.blue,
]);

final map = set.asNameMap();

また、通常は同じenum型の値では、それぞれ異なる名前が定義されています。

例えば、

enum Color {
  red,
  green,
  blue,
}

では、redgreenblueという異なる名前を持っています。

asNameMapメソッドでは、この名前がMapのキーとして使用されます。

なお、異なるenum型の値などを組み合わせ、同じ名前を持つenum値が複数含まれている場合、作成されるMapでは同じキーを複数保持することはできません。

基本的には、1つのenum型の値をまとめて扱う用途で使用するのがわかりやすそうです。

目次へ

5. byNameメソッドとの違い

enumの名前からenum値を取得する方法として、byNameメソッドもあります。

例えば、enumに自動的に用意されるvaluesに対して、次のように使用できます。

enum Color {
  red,
  green,
  blue,
}

void main() {
  final color = Color.values.byName('green');

  print(color);
}

実行結果

Color.green

byNameメソッドでは、

Color.values.byName('green')

のように名前を指定して、該当するenum値を直接取得します。

一方、asNameMapメソッドでは、

final map = Color.values.asNameMap();

として、最初にenumの名前とenum値を対応付けたMapを作成します。

その後は、

final color = map['green'];

のようにMapからenum値を取得できます。

大きな違いは、名前による検索を繰り返す場合です。

byNameメソッドは、呼び出すたびに要素を順番に調べて、指定された名前と一致するenum値を検索します。

一方、asNameMapメソッドであらかじめMapを作成しておけば、そのMapを使用して名前からenum値を検索できます。

例えば、次のようにMapを保持して利用できます。

enum Color {
  red,
  green,
  blue,
}

void main() {
  final colorMap = Color.values.asNameMap();

  print(colorMap['red']);
  print(colorMap['green']);
  print(colorMap['blue']);
}

実行結果

Color.red
Color.green
Color.blue

また、存在しない名前を指定した場合の動作にも違いがあります。

byNameメソッドでは、指定した名前を持つenum値が存在しない場合はArgumentErrorが発生します。

一方、

map['yellow']

のようにasNameMapメソッドで作成したMapから取得する場合、該当するキーが存在しなければnullが返されます。

そのため、名前からenum値を1回だけ取得するような場合はbyNameメソッド、名前からenum値を何度も検索したい場合や、存在しない名前をnullとして扱いたい場合はasNameMapメソッドで作成したMapを使用する方法が便利そうです。

なお、asNameMapメソッドはHashSet固有のメソッドではありません。

enum値を要素とするIterableで利用できるEnumByName拡張のメソッドなので、HashSet以外でも使用できます。

例えば、enumに自動的に用意されるvaluesでも、

final map = Color.values.asNameMap();

のように使用できます。

リファレンス

Dart

DartPad

HashSet

Set

EnumByName

EnumByName.asNameMap

目次へ

6. おわりに

enum値を格納したHashSetから、enumの名前をキーにしたMapを作成するには、asNameMapメソッドを使用します。

例えば、

final map = set.asNameMap();

とすると、各enum値のnameをキー、enum値そのものを値とするMapが作成されます。

Color.redColor.greenColor.blueが格納されている場合は、

{
  'red': Color.red,
  'green': Color.green,
  'blue': Color.blue,
}

のようなMapとして扱えます。

作成したMapでは、

final color = map['green'];

のようにenumの名前からenum値を取得できます。

また、byNameメソッドを使用して、

Color.values.byName('green');

のように名前からenum値を直接取得することもできます。

名前からenum値を1回だけ取得する場合はbyNameメソッド、名前による検索を繰り返す場合や、存在しない名前をnullとして扱いたい場合はasNameMapメソッドでMapを作成して利用するとよさそうです。

なお、asNameMapメソッドはHashSet固有のメソッドではなく、enum値を要素とするIterableで利用できるEnumByName拡張によって提供されています。

そのため、HashSetだけでなく、

Color.values.asNameMap();

のように、enumのvaluesなどでも利用できます。

目次へ


私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。

組み込み分野では、リアルタイムOSを利用したシステム開発をはじめ、弊社製品のハイブリッドOS Bi-OS など、長年培ってきた組み込み・制御系の技術を活かした開発に取り組んでいます。

また、iOS(Swift/SwiftUI)やWindows(C#)をはじめとしたアプリケーション開発、Webシステムの開発などにも対応しています。

組み込みソフトウェア、モバイルアプリ、Windowsアプリ、Webシステムなど、ソフトウェア開発に関するご相談がございましたら、お気軽にお問い合わせください。

また、ニューラルでは一緒にソフトウェア開発に取り組んでいただける技術者の方も募集しています。
ご興味がございましたら、お気軽にお問い合わせください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ