🐕

【Flutter】dartのswtich文ならぬ、switch式というのがあるらしい

2024/02/10に公開

これ、読めねー。ってことで。

                AuthStateChangeAction(((context, state) {
                  final user = switch (state) {
                    SignedIn state => state.user,
                    UserCreated state => state.credential.user,
                    _ => null
                  };

chatgpt先生にきいたところ、swtich式というものらしい。
初耳すぎてびっくり。

chatgptの回答

Dart 3は新機能「Switch式」を導入しており、従来のSwitch文に比べて、値を直接返すことができる表現力豊かな構文を提供します。この機能は、パターンマッチングをサポートし、より簡潔で読みやすいコードを実現します。また、全てのケースを網羅していない場合にコンパイル時エラーを出す「Exhaustiveness checking」という特性も備えています。これにより、Flutterでのウィジェット構成や状態管理が、さらに簡潔で読みやすくなります​​。

SignedIn stateのように型名の後にstateを宣言する理由は、パターンマッチングの一部として、マッチしたオブジェクトを新しい変数として扱うためです。この構文により、switch式の各ケースでマッチしたオブジェクトの具体的な型が明示され、その型に基づいたプロパティやメソッドに直接アクセスできるようになります。つまり、SignedIn型のstateがマッチした場合、そのstate変数を通じてSignedInクラス特有のプロパティやメソッドにアクセスできるようにするために、このように宣言しています。

どういうことか

要するに、
SignedIn state => state.user,
っていう書き方の
左辺は、型のパターンマッチングとしてこういう風に書いていいですよっていうことらしい。
で、このstateってもともとのstateをしめしているのか?というと、むずいんですけど以下みたいです。

SignedIn abc => state.user,

こういう書き方はだめ。

SignedIn abc => abc.user,

はOK。

要するに左辺で新しい変数としてswitch (state)のstateを参照できるようにしている。
で、その変数を利用して右辺で結果をリターンするという形。

とりあえず便利そうなのはわかるが、書けるかというと難しそう。

Discussion