前回の記事ではDart公式ドキュメントを参考に、クラスの基本事項と、コンストラクタについてご紹介しました。今回は列挙型(enum)についてご紹介いたします。
・Dartのドキュメント(https://dart.dev/guides/language/language-tour)
–> 内容はこのページに沿っています。
Dart Pad(https://dartpad.dev/)
–> Dartのコードを試せるplaygroundです。コードをすぐに試せます。
ドキュメントには、次のように掲載されています。
列挙型は、多くの場合enumerationまたはenumsと呼ばれ、固定数の定数値を表すために使用される特別な種類のクラスです。
ここにあるように、enumの正体はクラスであることがわかります。
では、実際に例を見てみたいと思います。
enum Color {
red,
green,
blue,
}
利用する際は Color.red のようにして値を呼び出します。
また、上記の例で、redという文字列自体を使用したい場合は Color.red.name と記述します。
上記ではシンプルな(通常の)enumの使用方法をご紹介しました。
Dartではさらに、「Enhanced enums」と呼ばれる、通常のクラス宣言のように「フィールド」、「コンストラクタ(const コンストラクタ)」、「メソッド」を含めたenumを宣言することが可能です。
ドキュメントの例を見てみたいと思います。
enum Vehicle implements Comparable<Vehicle> {
car(tires: 4, passengers: 5, carbonPerKilometer: 400),
bus(tires: 6, passengers: 50, carbonPerKilometer: 800),
bicycle(tires: 2, passengers: 1, carbonPerKilometer: 0);
const Vehicle({
required this.tires,
required this.passengers,
required this.carbonPerKilometer,
});
final int tires;
final int passengers;
final int carbonPerKilometer;
int get carbonFootprint => (carbonPerKilometer / passengers).round();
bool get isTwoWheeled => this == Vehicle.bicycle;
@override
int compareTo(Vehicle other) => carbonFootprint -other.carbonFootprint;
}
この例では、コンストラクタ、tires, passengers, carbonPerKilometer といったフィールド、carbonFootprint, isTwoWheeled, compareTo といったメソッドと、最初の例には含まれていなかった要素が記述されています。
※ enumは宣言すると、Dartの Enumクラス を自動で継承します。これにより、enumは Color() のような明示的なインスタンス化はできません。
これについては Enhanced enums の場合も同様です。
上記の例では、car, bus, bicycle という3つの値が用意されていますので、例えば以下のようにして呼び出すことができます。
final car = Vehicle.car;
さらに、このインスタンスのフィールドを取得することも可能です。
final carTires = Vehicle.car.tires; // --> 4
メソッドも利用してみましょう。
final car = Vehicle.car;
print(car.isTwoWheeled); // --> false
このようにして、Enhanced enums を利用するとさまざまな拡張を行なったenumを宣言することが可能です。
今回はenumに焦点を当ててご紹介いたしました。
通常は シンプルなenumを利用することが多いかと思いますが、Enhanced enumsも使いこなして実装を進めたいですね。
※ Enhanced enums は バージョン2.17 以上のDartでのみ利用できます。
Flutterでこれを利用したい場合は pubspec.yaml の中の environment 部分を以下のように変更する必要があります。
environment:
- sdk: ">=2.16.2 <3.0.0"
+ sdk: ">=2.17.0 <3.0.0"
山口県生まれ、山口県育ち。超インドアなので外出することは少なめですが、Webを身近に感じていただける技術トピックなどを中心にご紹介できればと思っています。よろしくお願いいたします!
REC.