Dartのチートシート的なもの
Flutterを学ぶ前にまとめてみました。
私が実際に見てDartを学んだおすすめの動画はこちら
↓
型
String | 文字列 |
int | 数値 |
double | 小数点を含む数値 |
bool | 真偽値 |
List | 配列 |
Map | オブジェクト |
Function | 関数・メソッド |
Future | async/await |
Widget | UIを構築しているパーツ Flutterで使用する |
dynamic | 任意の型 |
変数定義
型を宣言して定義
String name = "panshoku";
int age = 100;
double width = 0.25;
bool isTall = false;
List<String> nameList = ["panshoku", "gohan"];
Map<int, String> nameMap = {
10: "panshoku",
20: "gohan",
};
Map<String, dynamic> person = {
'name': 'Alice',
'age': 30,
'isStudent': false,
'scores': [90, 85, 95],
};
リスト・マップ
取り出し方
nameList[0]; // panshoku
nameMap[10]; // panshoku
Function 関数・メソッド
書き方比較
※デフォルト値の設定・nullableについては後述
関数宣言 | 呼び出し方 | 引数 | nullable(引数を指定しない) | |
---|---|---|---|---|
基本 引数 | void basicFunc(int a, int b) | basicFunc(20, 100) | 順番通りに指定 | 基本NG 後述 |
key付 引数 | void mapFunc({int a, int b}) | mapFunc(a: 20, b: 100) | 順不同OK | OK |
list 引数 | void listFunc([int a, int b]) | basicFunc(20, 100) | 順番通りに指定 | OK |
型指定 | String stringFunc() | stringFunc() | 上記3つに準ずる | 上記3つに準ずる |
アロー関数 | String arrowFunc() => | arrowFunc() | 上記3つに準ずる | 上記3つに準ずる |
例
void basicFunc(int sumNum) {
int age = 100;
print(age + x);
}
basicFunc(20); // 120
void mapFunc({int age, int sumNum}) {
print((age ?? 0) + (sumNum ?? 0));
}
// !波かっこ不要!
mapFunc(sumNum: 20, age: 100); // 120
mapFunc(age: 100); // 100
mapFunc(); // 0
void listFunc([int age, int multipleNum]) {
int twice = (multipleNum ?? 0) * 2;
print((age ?? 0) * twice);
}
// key不要
listFunc(100, 2); // 100 * (2 * 2) = 400
listFunc(2, 10); // 2 * (10 * 2) = 40
listFunc(100); // 100 * (0 * 2) = 0
listFunc(); // 0 * (0 * 2) = 0
String stringFunc(){
return "panshoku";
}
String name = stringFunc(); // panshoku
String arrowFunc() => "panshoku" // return と同意
String name = arrowFunc(); // panshoku
nullable (nullを許容する)
書き方
typeScriptでいうオプショナルみたいな書き方ができる
String? name = null;
void basicFunc(int?: a, int?: b) {
// nullの時の条件分岐など必要
}
※ mapFunc や listFunc は、すでに nullable
引数にデフォルト値を指定する
void basicFunc(int: a = 0, int: b = 0) {
...
}
void mapFunc({int: a = 0, int: b = 0}) {
...
}
void listFunc([int: a = 0, int: b = 0]) {
...
}
Future
async が必要
Future<void> awaitFinish() async {
print("start");
// print finish after 3seconds
await Future.delayed(Duration(seconds: 3));
print("finish");
}
awaitFinish();
定数
宣言方法 | 変数入れられるか | 実行タイミング |
---|---|---|
const | NG | プログラム実行前 |
final | OK | final 実行時 |
const String name = "panshoku"
final String name = "panshoku"
// ok
String name = "panshoku";
final String name2 = name;
※ name2 = "木村" 定数なのでできない
// ng
String name = "panshoku";
const String name2 = name;
クラス
class Person {
String name;
int age;
// コンストラクター
Person({this.name, this.age});
}
List<Person> personList = [
Person(name: "田中", age: 12),
Person(name: "木村", age: 12),
]
class Person {
String name;
int age;
// コンストラクター
Person(this.name, this.age);
}
List<Person> personList = [
Person("田中", 12),
Person("木村", 12),
]
class Person {
String name;
int age;
// コンストラクター
Person([this.name, this.age]);
}
List<Person> personList = [
Person("田中", 12),
Person("木村", 12),
]
プライベート
他からアクセスできないようにする。_をつける。
// person.dart
class Person {
String name = "パン";
int _age = 21;
}
// main.dart
import "person.dart";
Person personInstance = Person():
print(personInstance.name);
print(personInstance._age); // エラー
スタティック
インスタンス化なしでアクセスできる。staticをつける。
// person.dart
class Person {
String name = "パン;
static int age = 23;
}
// main.dart
import "person.dart";
print(Person.age); // これで呼べる
比較
使い方 | 使いどころ | |
プライベート | 型 _変数名 | 毎回値を変えてインスタンスを作るとき |
スタティック | static 型 変数名 | 固定値を使うとき |
代入
String name = "パン";
print(name); // パン
name = "ごはん"; // 上書きできる
print(name); // ごはん
演算子
計算 (算術演算子 / 代入演算子)
算術演算子: + – * / % ~/
代入演算子: += -= *= /=
注意 | |||
足し算 | + | int age = 10; age = age + 1; // 11 | |
+ 1 | ++ | int age = 10; age++; // 11 | |
+ n | += | int age = 10; age += 2 // 12 | |
引き算 | – | int age = 10; age = age – 1; // 9 | |
– 1 | — | int age = 10; age–; // 9 | |
– n | -= | int age = 10; age -= 2 // 12 | |
掛け算 | * | int age = 10; age = age * 2; // 20 | |
* n | *= | int age = 10; age *= 2 // 20 | |
割り算 | / | double | double age = 10; age = age / 2; // 5 |
/ n | /= | double | double age = 10; age /= 2; // 5 |
割り算 余り | % | int age = 10; age = age % 1; // 0 | |
割り算 商 | ~/ | int age = 10; age = age ~/ 1; // 10 |
比較演算子
等しい | == | int age = 10; age == 10; // true |
等しくない | != | int age = 10; age != 10; // false |
より小さい | < | int age = 10; age < 10; // false |
より大きい | > | int age = 10; age > 10; // false |
以下 | <= | int age = 10; age <= 10; // true |
以上 | >= | int age = 10; age >= 10; // true |
論理演算子
演算子 | 記号 | 説明 | 例 |
---|---|---|---|
AND | && | 両方の条件が真であれば真 | a && b |
OR | || | どちらかの条件が真であれば真 | a || b |
NOT | ! | 条件が真であれば偽、偽であれば真 | !a |
三項演算子 ? :
int age = 10;
int age2 = 20;
String result = age > age2 ? 'ageはage2より大きい' : 'ageはage2より小さいまたは等しい';
print(result); // ageはage2より小さいまたは等しい
スコープ
グローバルスコープ
プログラム全体でアクセス可能
int age1 = 25; // グローバル変数
void main() {
print(age1); // 25 を出力
}
ローカルスコープ
その関数やブロック内でのみアクセス可能
void main() {
int age2 = 30; // ローカル変数
if (true) {
int age3 = 35; // ローカル変数(ブロックスコープ)
print(age2); // 30 を出力
print(age3); // 35 を出力
}
print(age2); // 30 を出力
// print(age3); // エラー:age3はこのスコープではアクセスできません
}
条件分岐
if ~ else if ~ else
int num = 10;
if (num > 20) {
print('numは20より大きい');
} else if (num > 10) {
print('numは10より大きいが、20以下');
} else if (num == 10) {
print('numは10です');
} else {
print('numは10以下');
}
switch ~ case ~ default
void main() {
int age = 18;
switch (age) {
case 16:
print('16歳です。');
break;
case 18:
print('18歳です。'); // これが出力される
break;
case 21:
print('21歳です。');
break;
default:
print('その他の年齢です。');
}
}
enum 列挙型
- あらかじめ値を定義しておくクラス。名前付き定数郡。
- コードの可読性と整合性が向上
- switch文のcaseなどで、文字列だとミスに気付きにくい
- enumを使うと良い(TypeScriptみたい)
// Seasonという名前の列挙型を定義
enum Season {
spring,
summer,
autumn,
winter
}
void main() {
// 使い方
Season currentSeason = Season.summer;
// こういうときに使いたい
switch (currentSeason) {
case Season.spring:
print('春です。');
break;
// 文字列だと case "sammer" というタイポに気付きづらい
case Season.summer:
print('夏です。');
break;
case Season.autumn:
print('秋です。');
break;
case Season.winter:
print('冬です。');
break;
}
}
ループ
for | 指定された回数だけ繰り返し処理を実行 |
for in | コレクション(リスト、セット、マップなど)の要素を簡単に反復処理できる |
while | 指定された条件が真である限り、ループ内の処理が繰り返し実行される |
do ~ while | 条件式がループの最後で評価されるので、ループ内の処理が少なくとも一度は実行される |
// for
for (int i = 0; i < 5; i++) {
print('繰り返し $i');
}
// for - in
List<String> fruits = ['apple', 'banana', 'orange'];
for (String fruit in fruits) {
print('フルーツ: $fruit');
}
Map<String, int> scores = {
'Alice': 90,
'Bob': 80,
'Charlie': 85,
};
for (var entry in scores.entries) {
print('${entry.key} のスコア: ${entry.value}');
}
// while
int i = 0;
while (i < 5) {
print('繰り返し $i');
i++;
}
// do - while
int i = 0;
do {
print('繰り返し $i');
i++;
} while (i < 5);
まとめ
DartはTypeScriptと似ているので、TypeScript経験者なら学習コストかからずに習得できそうです。
コメント