📘

Dart基本文法

2022/01/12に公開

社内の勉強会用です。

環境

Dart 2.15.1

基本の型

  • int: 数値
  • double: 浮動小数
  • String: 文字列
  • bool: 真偽値
  • List: 配列
  • Set: 順番を持たず、重複を許さないオブジェクト
  • Map: key, valueのセット

変数宣言

// 再代入不可
final String name = 'hoge';
name = 'fuga'; // 解析エラー

// 再代入可能
var int point = 50;
point = 100;

// 型推論機能
final name = 'fuga';

// 型が不明なことを明示する場合はdynamicが使える
dynamic hogeFunc(bool result) {
    if (result) {
      return 100;
    } else {
      return false;
    }
}

final dynamic value = hogeFunc(true);

null safety(ver2.12以降)

// 型に?を付けることでnull許容型となる
String? name;
print(name); // null

// nullの可能性があるため解析エラー
print(name.length);

// 1.nullチェックすることで実行可能
if (name != null) {
    print(name.length);
}

// 2. nullの可能性がない場合はforce-unwrapも使用可能。
//    万が一nullの状態で処理が走ってしまうとアプリがクラッシュ
print(name!.length); //

// オプショナルチェインニング
print(name?.length) // nameがnullの場合はnullが出力される

条件分岐

enum Club {
    soccer,
    baseball,
    tennis,
}

if

if (club == Club.soccer) {
    print('soccer');
} else if (club == Club.baseball) {
    print('baseball');
} else {
    print('tennis');
}

三項演算子

print(result == true ? 'hoge' : 'fuga');

switch

switch (club) {
case Club.soccer:
    print('soccer');
    break;
case Club.baseball:
    print('baseball');
    break;
case Club.tennis:
    print('tennis');
    break;
// 条件に一致しない場合
default:
    print('not match');
}

ループ処理

for

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

for-in

final _fruits = ['apple', 'banana', 'grape', 'orange'];
for (final fruit in _fruits) {
    print(fruit)
}

foreach

_fruits.forEach(print);

while

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

do while

do {
    print(i);
    i++;
} while (i < 10);

非同期処理

asyncとawaitをセットで使う

void hoge() async {
    print('遅延前');
    await Future<void>.delayed(const Duration(seconds: 1));
    print('遅延後');
}

関数

/*
戻り値の型: void -> 戻り値なし
引数の型: bool
引数名: 無名
*/
void hoge(bool result) {
    print(result); // true or false
    return 'hoge'; // 解析エラー
}

/*
戻り値の型: String
引数の有無: requiredパラメータがついているため必須
引数の型: String
引数名: userName
*/
String getSelfIntroduction({required String userName}) {
    return '私の名前は$userNameです';
}

/*
引数の有無: どちらでも可。引数がなかった場合、デフォルト値の`名前無し`が値として入る。
           null許容型ではないため、デフォルト値がないと解析エラー
引数の型: String
*/
String getSelfIntroduction({String userName = '名前なし'}) {
    return '私の名前は$userNameです';
}

/*
引数の有無: どちらでも可。引数がなかった場合、nullが値として入る
引数の型: null許容型のString
*/
String getSelfIntroduction({String? userName}) {
    return '私の名前は$userNameです';
}

配列

var list<int> = [1, 2, 3];

collection if

var list = [
    1,
    2,
    3,
    if (result) 4,
];

シャローコピー

var list2 = list;
print(list2 == list) // true

ディープコピー

var list2 = [...list];
print(list2 == list) // false

Cascade notation

final list = [1, 2, 3]
    ..shuffle()
    ..add(4);
print(list) // [3, 1, 2, 4]

Discussion