🎯

[Dart/Flutter] if-caseパターンで!を回避する

2025/02/27に公開

if-case パターンで!を回避する

今回は、Dart 3 で導入されたパターンマッチングを用いて型安全に変数を扱う方法を紹介します。

はじめに

Flutter アプリの開発では、nullable な値を扱うケースが頻繁にありますよね。例えば以下のようなコードです。

if (user?.settings?.theme != null) {
  applyTheme(user!.settings!.theme);
}

コードを見れば存在するとわかっていても、! は怖いです。
できれば避けたいものです。

Dart 3 ではif caseを使ってより表現力豊かに書けるようになりました。

if case パターンの基本

まずは簡単な例から紹介していきます

// 一般的な書き方
void updateProfile(User? user) {
  if (user?.name != null) {
    print(user!.name);
  }
}

// if caseを使った書き方
void updateProfile(User? user) {
  if (user case User(name: final name)) {
    print(name);  // 変数が直接使えて便利!
  }
}

if caseを使うと、null チェックと値の取り出しを 1 行で書け! を使わないですむため便利です。

ネストしたプロパティも簡潔に書ける

複数の階層を持つオブジェクトでも、if caseなら簡潔に書けます:

// 一般的な書き方
void updateTheme(UserPreferences? prefs) {
  if (prefs?.theme?.colorScheme != null) {
    applyColorScheme(prefs.theme.colorScheme);
  }
}

// if caseを使った書き方
void updateTheme(UserPreferences? prefs) {
  if (prefs case UserPreferences(theme: Theme(colorScheme: final scheme)?)) {
    applyColorScheme(scheme);  // 必要な値だけ取り出せる!
  }
}

if case の便利な使い方

以下のような場面で特に重宝します:

  1. ネストしたプロパティの取り出し

    // if caseを使うと一度に取り出せる
    if (response case ApiResponse(
      data: Data(user: User(settings: final settings)?)
    )) {
      updateSettings(settings);  // 深い階層の値も直接アクセス
    }
    
  2. 条件付きの値の抽出

    // 値の取り出しと条件チェックを同時に
    if (result case Success(value: final v) when v > 0) {
      processValue(v);  // 条件を満たす値を直接使える
    }
    
  3. 複数の値の同時チェック

    // 複数のプロパティを一度に取り出せる
    if (user case User(name: final name, age: final age)) {
      register(name, age);  // 両方の値が使える
    }
    

パターンマッチングの活用

  1. 分かりやすい変数名に変更して使う

    // より明確な変数名で
    if (res case ApiResponse(data: final userData)) {
      processUserData(userData);
    }
    
  2. 複雑なパターンは分割する

    // 段階的に処理することで可読性アップ
    if (response case ApiResponse(data: final data)) {
      if (data case UserData(settings: final settings)) {
        updateSettings(settings);
      }
    }
    

まとめ

if case パターンは、Dart の型システムをより活用できます。キモは以下です

  • 必要な値を直接取り出せる
  • 型安全性が保証される
  • コードがより意図を表現できる
  • 複雑なデータ構造も扱いやすい

参考資料

Reddit のコミュニティではそれでも ! を使っていきたいという層もいるようです。
開発チームの好みに合わせて使い分けてみてください。

実際に使ってみた感想や、他の活用方法があれば、ぜひコメントで教えてください!

Discussion