Dartの基礎文法

## 動機
Dart完全に理解したから
（訳：全然わからんから）

## 前提
当記事は詳細事項は記述していません。
できるだけ簡単な言葉で手短に表現していますので、詳しく知りたい方は[公式ドキュメント](https://dart.dev/guides "Dart公式 ドキュメント")を参考にしてください。

## 型
・int（整数）
・double（小数）
・String（文字列）
・bool（真偽値）
・List（配列）
・Map（連想配列）
・Set（順番がないユニークな配列）

## Null許容
Dartでは、nullを許容するか否かを明示できます。
```int?```のように、```?```が付いていればnullable
付いていなければnot nullです。

```dart 
String? hoge = null  //OK!
String hoge = null  //エラー
```

## 変数 宣言
宣言の仕方は下記です。
```dart
String hoge = "こんにちは";
int huga = 1;
```
varとは、型推論してくれる変数宣言方法です。
何の型でも入れてOKなやつです。
ただ、varを多様すると重くなるので注意。

## 定数
・const
・final

共通項は
・再代入ができないこと
・型推論してくれること。

違いは、「いつ、その定数を見られるか」です。

constは、コンパイル時に見られるため、コンパイル時には値が確定しておく必要があります。
finalは、コンパイル後に見られるため、コンパイル後でも値を格納できます。
```dart
const hoge = "もう変更できないよ";

final huga;
//↓コンパイル後
huga = DateTime.now();
```

## 参照範囲制限
Dartでは、頭に```_```を付けると参照範囲の制限を行うことができます。
そのクラスやライブラリのみでしか参照できない ということです。
```dart
String _hoge = "サンプル";
```
そのプロジェクトに同じ名前の変数が複数ある場合などに、間違えて使用しないために制限します。

## 文法
### 〜条件分岐〜
#### if文
```dart
if(条件式){
  //処理
}else if{
  //処理
}
```

#### switch文
```dart
switch (式（変数）) {
  case A:
    //式が値Aに当てはまる場合に実行される処理
    break;

  case B:
    //式が値Bに当てはまる場合に実行される処理
    break;

  case C:
    //式が値Cに当てはまる場合に実行される処理
    break;
} 
```

#### 三項演算子
```dart
print(result == true ? 'A' : 'B');
```
```result```が```true```の場合Aを出力
```false```の場合はBを出力

### 〜ループ処理〜
#### for文
```dart
for (var i = 0; i < 10; i++) {
    print(i);
}
```
左）変数 i を定義
中）i が10より小さければ繰り返す条件式
右）1回回るごとに値を1加算

#### for-in文
```dart
final _words = ['A', 'B', 'C', 'D'];

for (final word in _words) {
    print(word)
}

//出力結果：A B C D
```
定数```_words```を、変数```word```に取り出し、出力している。

#### forEach文
```dart
List words = ['A', 'B', 'C'];
words.forEach((word) {
  print(word);
});

// 省略して下記のようにも書ける。
words.forEach((word) => print(word));

// さらに省略することもできる。
words.forEach(print);
```
変数```words```を```word```に分解して、個数分回しています。

ただし、Map型の場合は少し違います。
```dart
Map map = {
  'apple': 'リンゴ', 
  'orange': 'オレンジ', 
  'banana': 'バナナ'
 };

map.forEach((var key, var value) {
  print('$key : $value');
});

//出力結果：apple:リンゴ　orange:オレンジ　banana:バナナ
```
Map型の場合は、引数にKeyとValueの二つを指定し、型も明示しなくてはいけません。
※ KeyかValueの片方のみ、取り出したい場合は、別の記載方法になる。

#### while文
```dart
var i = 0;
while (i < 10) {
    print(i);
    i++;
}
```
処理内容は、for文のものと同じです。

#### do-while文
```dart
do{
  //処理
}while(条件式)
```
do-while文は、処理実行後にループするか否か判断します。
```dart
int num = 0;

do {
    print(num);
    num++;
  } while (num < 3);
  print('ループ終了！');

//出力結果：0 1 2 ループ終了！
```

#### async-await文（非同期処理）
async-await文は、理解するまでにかなり時間がかかりました。
~~例文法は記載しますが、詳しく解説しているサイトを参考にした方がいいと思います。~~

【追記】気が向いたので解説します。

・async - 「この関数は全て非同期で行うよ」 という宣言
・await - 「でも、ワイが終わるまでは待っといてな」 という意味


```dart
void main() {
  print('ステップ１');
  step2();
  print('ステップ３');
}

Future<void> step2() async {
  print('ステップ２-1');
  await Future.delayed(Duration(seconds: 3));
  print('ステップ２-2');
}

//出力結果：
//ステップ１
//ステップ２-1
//ステップ３
//ステップ２-2
```
① ステップ1が出力
② step2()が発動し、ステップ2-1が出力される
③ awaitさん登場、「ワイが終わるまで(3秒間)待ってくれ」
④ ステップ3が出力
⑤ 「③」が終わり、ステップ2-2が出力

恐らく下記疑問が湧いたと思います。
・```await```さんが「待って」と言ってるのに、なぜステップ3が出力されたんや？
・```Future<void>```←これなんなん？

実はコレ、二つとも関係があるんです。
まず、```Future<void>```は、非同期関数を宣言する際に書くものです。（そういう決まり事）
関数自体が非同期扱いされるので、例え```step2()```が終わってなくても次の処理に進んでしまうのです。
```await```さんが「待って」と言えるのは、その関数の中の処理に対してだけなんです。

## 所感
最後までお読み頂き、ありがとうございます。

ずっとPHPしか触っていなかったので、とても新鮮な印象がありました。
一応、基礎中の基礎は書きましたが、まだ記載していない文法等もあるので、随時更新していきます。
誤記などありましたらコメント頂けると助かります。