2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Dartの基礎文法

Last updated at Posted at 2022-02-27

動機

Dart完全に理解したから
(訳:全然わからんから)

前提

当記事は詳細事項は記述していません。
できるだけ簡単な言葉で手短に表現していますので、詳しく知りたい方は公式ドキュメントを参考にしてください。

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

Null許容

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

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

変数 宣言

宣言の仕方は下記です。

String hoge = "こんにちは";
int huga = 1;

varとは、型推論してくれる変数宣言方法です。
何の型でも入れてOKなやつです。
ただ、varを多様すると重くなるので注意。

定数

・const
・final

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

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

constは、コンパイル時に見られるため、コンパイル時には値が確定しておく必要があります。
finalは、コンパイル後に見られるため、コンパイル後でも値を格納できます。

const hoge = "もう変更できないよ";

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

参照範囲制限

Dartでは、頭に_を付けると参照範囲の制限を行うことができます。
そのクラスやライブラリのみでしか参照できない ということです。

String _hoge = "サンプル";

そのプロジェクトに同じ名前の変数が複数ある場合などに、間違えて使用しないために制限します。

文法

〜条件分岐〜

if文

if(条件式){
  //処理
}else if{
  //処理
}

switch文

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

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

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

三項演算子

print(result == true ? 'A' : 'B');

resulttrueの場合Aを出力
falseの場合はBを出力

〜ループ処理〜

for文

for (var i = 0; i < 10; i++) {
    print(i);
}

左)変数 i を定義
中)i が10より小さければ繰り返す条件式
右)1回回るごとに値を1加算

for-in文

final _words = ['A', 'B', 'C', 'D'];

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

//出力結果:A B C D

定数_wordsを、変数wordに取り出し、出力している。

forEach文

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

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

// さらに省略することもできる。
words.forEach(print);

変数wordswordに分解して、個数分回しています。

ただし、Map型の場合は少し違います。

Map map = {
  'apple': 'リンゴ', 
  'orange': 'オレンジ', 
  'banana': 'バナナ'
 };

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

//出力結果:apple:リンゴ orange:オレンジ banana:バナナ

Map型の場合は、引数にKeyとValueの二つを指定し、型も明示しなくてはいけません。
※ KeyかValueの片方のみ、取り出したい場合は、別の記載方法になる。

while文

var i = 0;
while (i < 10) {
    print(i);
    i++;
}

処理内容は、for文のものと同じです。

do-while文

do{
  //処理
}while(条件式)

do-while文は、処理実行後にループするか否か判断します。

int num = 0;

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

//出力結果:0 1 2 ループ終了!

async-await文(非同期処理)

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

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

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

void main() {
  print('ステップ1');
  step2();
  print('ステップ3');
}

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

//出力結果:
//ステップ1
//ステップ2-1
//ステップ3
//ステップ2-2

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

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

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

所感

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

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?