🎯
[Dart/Flutter] if-caseパターンで!を回避する
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 の便利な使い方
以下のような場面で特に重宝します:
-
ネストしたプロパティの取り出し
// if caseを使うと一度に取り出せる if (response case ApiResponse( data: Data(user: User(settings: final settings)?) )) { updateSettings(settings); // 深い階層の値も直接アクセス }
-
条件付きの値の抽出
// 値の取り出しと条件チェックを同時に if (result case Success(value: final v) when v > 0) { processValue(v); // 条件を満たす値を直接使える }
-
複数の値の同時チェック
// 複数のプロパティを一度に取り出せる if (user case User(name: final name, age: final age)) { register(name, age); // 両方の値が使える }
パターンマッチングの活用
-
分かりやすい変数名に変更して使う
// より明確な変数名で if (res case ApiResponse(data: final userData)) { processUserData(userData); }
-
複雑なパターンは分割する
// 段階的に処理することで可読性アップ if (response case ApiResponse(data: final data)) { if (data case UserData(settings: final settings)) { updateSettings(settings); } }
まとめ
if case パターンは、Dart の型システムをより活用できます。キモは以下です
- 必要な値を直接取り出せる
- 型安全性が保証される
- コードがより意図を表現できる
- 複雑なデータ構造も扱いやすい
参考資料
Reddit のコミュニティではそれでも !
を使っていきたいという層もいるようです。
開発チームの好みに合わせて使い分けてみてください。
実際に使ってみた感想や、他の活用方法があれば、ぜひコメントで教えてください!
Discussion