【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part07 関数

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part07 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part06 Built-in型

今回から関数を学習します。

関数(メソッド?)の書き方

筆者は関数と記述しています。
クラス内に記述する処理の塊はメソッドと呼ぶような気もするのですが本書では関数で統一しているものとみなします。

書き方以下のようになっています。

戻り値の型 関数名(引数の型 引数名) {
  return "test";
}

戻り値が無い場合はvoidを指定します。
省略可能(return nullと同意)ですが筆者は推奨していません。私も同感です。
「書き忘れたのかな?」なんて邪推してしまいます。

シンタックスシュガーとして=>を使用可能・・・
シンタックスシュガーとはなんでしょう(´・ω・`)

糖衣構文 – Wikipedia

読みやすくするための「別の表現」ということでしょうかね。
=>を使用する場合は=>より右の部分(右オペランド)には「式」しか実装できません。

Dartには「式」と「文」の二種類の実装がありました。
そのうちの「式」だけ使用可能です。文に属するifは使えません。

名前付きパラメータ

関数の引数にて{ }で囲うことで 呼び出し側に引数名の指定を強制できます。
かつ{ }で囲まれた引数を使うのは任意となります。
引数名を指定しないで呼び出した場合コンパイルエラーになります。
これは強力ですね😄

つまり「{ }内の引数を使うのは任意だけど使う場合は必ず引数名を指定すること」ということでしょうかね。

DartPadで以下の実装を行ったのですがコンパイルエラーとなってしまいました。

void main() {
  enableFlags(bold:false, hidden:true);
}

void enableFlags({bool bold, bool hidden}) {
  print("test");
}

以下のような意味のようです。

名前付きパラメータの初期値はnull。実装したboldとhiddenはboolだからnullを初期値に使うことはできないよ。

Dartのバージョンが上がってエラーとなるようになったのかもしれませんね。
初期値を指定してあげるとエラーが出なくなりました。
※初期値の部分の実装は経験からくる「勘」です(笑

void main() {
  enableFlags(bold:false, hidden:true);
}

void enableFlags({bool bold = false, bool hidden = false}) {
  print("test");
}

すこし付け加えていろいろ試しました。

///
///名前付き引数
///
void main() {
  // 使用する場合は名前を指定してあげる
  enableFlags(bold:false, hidden:true); 
  
  // 引数の与え方について、順序は関係なし
  enableFlags(hidden:false, bold:true); 
  
  // 引数を使わなくてもよい
  enableFlags();
  
  // 引数を使う場合は必ず名前を指定(この記述はコンパイルエラー)
  // enableFlags(true, true);
  
  // 引数の一部のみ使用することができる
  enableFlags(hidden: true);
  
}

void enableFlags({bool bold = false, bool hidden = false}) {
  print("test");
}

必須にしたい

名前付き引数を使用する際、{ }で囲まれた引数は「オプション」扱いとなるようです。
「名前付きかつ値を渡すことが必須!」ということを実現したい場合は@requiredを該当の引数の型の直前に宣言します。
と、本書では紹介されていますが、Dartのバージョンが上がり@が外れたようです。

Flutter2.2以降は「@required」が「required」に変更されました(「@」が不要に)

///
///名前付き引数(required確認)
///
void main() {
  // 使用する場合は名前を指定してあげる
  enableFlags(bold:false, hidden:true); 
  
  // 引数の与え方について、順序は関係なし
  enableFlags(hidden:false, bold:true); 
  
  // boldを使用しいないのでコンパイルエラー
  // enableFlags();
  
  // 引数を使う場合は必ず名前を指定(この記述はコンパイルエラー)
  // enableFlags(true, true);
  
  // 引数の一部のみ使用することができる。
  // (ただし、required修飾されているものは必ず使用する必要があるのでコンパイルエラー)
  // enableFlags(hidden: true);
  
}

void enableFlags({ required bool bold, bool hidden = false}) {
  print("test");
}

部分的に名前付き引数にする

適用したい部分にだけ{ }で囲めばよいです。
ただし、「引数の先頭」や「引数の真ん中」で使用することはできません。

void main() {
  print("一部 { } で囲む。ルール。");
}

// 「引数の先頭」はダメ
//void hoge( { bool one = false}, bool two,  bool three) {
//  print("test");
//}

// 「引数の真ん中」はダメ
//void fuga( bool one, {bool two = false},  bool three) {
//  print("test");
//}

// 「引数の最後」はOK!
void fugo( bool one, bool two, {bool three = false}) {
  print("test");
}

一部にだけ名前付きを使用するルールは「一番後ろの引数を絡めないと使えない」と覚えるのがよさそうです。

最後に

名前付き引数は「オプション」扱いとセットになることがわかりました。
また名前付き引数の初期値は強制的にnullとなり、nullを扱えない型を使用するばあいは初期値の実装が必要です。
@requiredrequiredに変更されていました。この辺の考え方(以前のバージョンをバッサリ・・)がGoogleっぽいなぁと感じました。

今日はここまで!