Menu
Coddy logo textTech

switch文でのEnum

CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 61/65。

列挙型(enum)の最も強力な活用方法の一つは、それらをswitch文と一緒に使用することです。列挙型とswitch文を組み合わせることで、より安全でメンテナンス性の高いコードを作成できます。

switch文で列挙型(enum)を使用する方法は次のとおりです。

enum Status {
  pending,
  running,
  completed
}

Status currentStatus = Status.pending;

switch (currentStatus) {
  case Status.pending:
    print('Task is waiting to start');
    break;
  case Status.running:
    print('Task is currently in progress');
    break;
  case Status.completed:
    print('Task has been finished');
    break;
}

switch文でenumを使用する利点は、Dartがすべての可能なenumの値が処理されているかを確認できることです。いずれかのenumの値に対してcaseを含めるのを忘れた場合、Dartは警告を表示し、コード内のバグを防ぐのに役立ちます。

このアプローチは、タイポが予期しない動作を引き起こす可能性がある switch 文で文字列や数値を使用するよりも、はるかに安全です。enum を使用すると、コードがあらゆる可能性のあるシナリオを確実に処理できるようにするコンパイル時のチェックが行われます。

challenge icon

チャレンジ

簡単

列挙型(enums)とswitch文を使用して、ゲームキャラクターの状態を管理するプログラムを作成してください。あなたのタスクは以下の通りです:

  1. idlewalkingrunningjumpingattacking の値を持つ CharacterState という名前の列挙型を定義します。
  2. CharacterState 型の currentState という変数を作成し、CharacterState.idle を代入します。
  3. CharacterState パラメータを受け取り、switch文を使用して状態に基づいた文字列メッセージを返す getStateMessage という関数を作成します:
    • CharacterState.idle の場合:"Character is standing still" を返します
    • CharacterState.walking の場合:"Character is moving slowly" を返します
    • CharacterState.running の場合:"Character is moving quickly" を返します
    • CharacterState.jumping の場合:"Character is in the air" を返します
    • CharacterState.attacking の場合:"Character is fighting" を返します
  4. 関数を使用して、次の正確な形式で初期状態のメッセージを出力します:Initial state: Character is standing still
  5. currentStateCharacterState.walking に変更します。
  6. 次の正確な形式で更新された状態のメッセージを出力します:Updated state: Character is moving slowly
  7. currentStateCharacterState.attacking に変更します。
  8. 次の正確な形式で最終状態のメッセージを出力します:Final state: Character is fighting

プログラムでは、列挙型とswitch文を適切に使用し、この組み合わせがどのように型安全な状態管理を提供するかを示してください。switch文はすべての列挙型の値を処理し、各キャラクターの状態に対して適切なメッセージを返す必要があります。Dartの命名規則に従い、上記で指定された正確な文字列メッセージを使用してください。

チートシート

Enumは、型安全なコードを実現するために switch 文と組み合わせてうまく機能します:

enum Status {
  pending,
  running,
  completed
}

Status currentStatus = Status.pending;

switch (currentStatus) {
  case Status.pending:
    print('Task is waiting to start');
    break;
  case Status.running:
    print('Task is currently in progress');
    break;
  case Status.completed:
    print('Task has been finished');
    break;
}

Dartは、すべてのenum値がswitch文で処理されていることを検証し、バグを防ぐとともにコンパイル時のチェックを提供します。

自分で試してみよう

import 'dart:io';

// TODO: ここでCharacterStateのenumを定義してください

// TODO: ここでgetStateMessage関数を作成してください

void main() {
  // TODO: 以下にコードを記述してください
  
  // currentState変数を作成し、CharacterState.idleを代入します
  
  // 初期の状態メッセージを表示します
  
  // currentStateをCharacterState.walkingに変更します
  
  // 更新された状態メッセージを表示します
  
  // currentStateをCharacterState.attackingに変更します
  
  // 最終的な状態メッセージを表示します
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン