Flutterアプリ開発で使用されるDart言語の基礎文法をまとめました。
変数
- 変数とは文字列や数値などデータを格納しておくための場所
- 変数の初期化後に値を参照・変更できる
var
では型の変更ができないdynamic
では型の変更ができる
変数とは文字列や数値などのデータを格納しておくための場所のことです。
変数に格納したデータは変数名を呼び出すことでデータを参照したり、後から新しいデータを代入できます。
»【Flutter/Dart】変数の使い方|宣言・初期化・型の種類
型を固定して変数を初期化
変数で型を固定して初期化するにはvar
または使用する型
を宣言します。var
で型を初期化する場合、最初に代入した値の型に固定されます。(String型の値の場合はString型に固定)
//書き方
String 変数名 = String型の値;
int 変数名 = int型の値;
double 変数名 = double型の値;
bool 変数名 = bool型の値;
var 変数名 = 値 //初期化時の値の型で固定
//使用例
void main() {
String myString = 'Alex';
int myInt = 18;
double myDouble = 3.14;
bool myBool = true;
var myVar = 'Hello World';
print(myString); //Alex
print(myInt); //18
print(myDouble); //3.14
print(myBool); //true
print(myVar); //Hello World
myString = 100; //String型と型が異なるためエラー
myVar = true; //初期化時の型と異なるためエラー
}
dynamicで変数を初期化
変数の型を固定せずに初期化する場合はdynamic
を宣言します。dynamic
で初期化された変数は異なる型の値を代入できます。
//書き方
dynamic 変数名 = 値;
//使用例
void main() {
dynamic myDynamic = 'Alex'; //String型の値で初期化
print(myDynamic);
myDynamic = 100; //int型の値を代入
print(myDynamic);
}
//出力結果
//Alex
//100
変数のまとめ記事はこちら↓
»【Flutter/Dart】変数とは?宣言と初期化・型の種類を解説
定数
- 定数とは変数と異なり再代入できない(一定値として維持できる)
- 定数には
final
とconst
の2種類がある final
はビルド時に値が代入されるconst
はコンパイル時に値が代入される
定数とは「円周率」や「名前」など一定値を維持したい場合に使用されます。
また定数では変数と異なり値を再代入するとエラーが発生します。
» 定数の使い方|finaltとconstの違いは?
定数の初期化
定数の初期化にはfinal
またはconst
を使用できます。final
ではビルド時、const
ではコンパイル時に値が代入されます。
//書き方
final 定数名 = 値;
const 定数名 = 値;
//使用例
void main() {
final myFinal = 'Alex';
const myConst = 3.1415;
myFinal = 'Brian'; //再代入するとエラー
myConst = 3; //再代入するとエラー
}
関数
- 関数でまとめておいた処理を必要な時に呼び出せる
- 関数で値を受け取ったり、返したりできる
コードを書いていると同様な処理を繰り返し使用する機会があります。その度に同じコードを書いていてはコードが長くなってしまいます。
そんな場合は「関数」を使用できます。関数を使用することで処理を1つにまとめておき必要な時に呼び出して定義しておいた処理を実行できます。
また関数を呼び出す際にデータを受け渡したり、関数の処理で取得したデータを返すことも可能です。
» 関数の使い方|引数を使って値を渡す・戻り値の取得
関数の定義
関数で実行したい処理を{}
の中に書いて定義します。
また関数を呼び出すには定義した関数を書くだけです。
//書き方
void 関数名(){
//処理...
}
//呼び出し方
関数名();
//使用例
void main() {
hello();
}
void hello() {
print('Hello World');
}
///出力結果
//Hello World
引数を使用して関数に値を渡す
関数を呼び出す際に値を渡して定義した処理で使用したい場合は「引数」を使用します。
関数の()
の中で関数の処理で使用する仮引数をデータ型とセットで定義し、関数を呼び出す際に指定したデータ型の引数を渡します。
//書き方
void 関数名(データ型 仮引数){
//処理...
}
//呼び出し方
関数名(引数);
//使用例
void main() {
add(1, 2);
}
void add(int a, int b) {
print('$a + $b = ${a + b}');
}
///出力結果
//1 + 2 = 3
関数から値を返す(戻り値の取得)
関数では処理で取得した値(戻り値)を返すことができます。
関数から値を返す場合void
の代わりに返したい値のデータ型を宣言し、処理の最後にreturn
で戻り値を指定します。
//書き方
戻り値の型 (){
//処理...
return 戻り値;
}
//使用例
void main() {
int total = add(1, 2);
print(total);
}
int add(int a, int b) {
return a + b;
}
///出力結果
//3
if文
- if文とは「AならばBを実行する」のように条件によって異なる処理を実行できる
- 条件式の結果(真か偽)で処理を指定
- else if, elseを使用することでより複雑な条件分岐ができる
if文は「AならばBを実行する」のように条件によって異なる処理を実行できます。
またこのような処理を「条件分岐」と言い、条件分岐は「条件式」と言われる式の結果によって処理を指定できます。
条件分岐:A >= Bの場合は〇〇の処理を実行
条件式: A >= Bの部分
» if文の使い方|else..if・elseで2択以上の条件分岐
if文の書き方(真の場合のみ処理を実行)
まずはif文の基本形を紹介します。
次の処理では条件式が真の場合のみ処理を実行します。また条件式では式の結果が真(true)または偽(false)になるように書きます。
//書き方
if (条件式) {
条件式が真の場合の処理...
}
//使用例
void main() {
int score1 = 73;
int score2 = 34;
if (score1 >= 70) {
print('$score1点は合格です!'); //「score1 >= 70」は真なので処理を実行
}
if (score2 >= 70) {
print('$score2点は合格です!');//「score2 >= 70」は偽なので処理を実行
}
}
///出力結果
//73点は合格です!
真と偽の2択で条件分岐:else
条件式の結果が真と偽の場合でそれぞれ処理を指定したい場合はelse
を使用します。else
で指定した処理は式の結果が真でない(偽である)場合にのみ実行されます。
//書き方
if (条件式) {
条件式が真の場合の処理...
}else{
条件式が偽の場合の処理...
}
//使用例
void main() {
int score1 = 73;
int score2 = 34;
if (score1 >= 70) {
print('合格です!'); //真なのでこちらの処理が実行
} else {
print('不合格です...'); //処理は実行されない
}
if (score2 >= 70) {
print('合格です!'); //処理は実行されない
} else {
print('不合格です...'); //偽なのでこちらの処理が実行
}
}
///出力結果
//73点は合格です!
3択以上の条件分岐:else if
3択以上の複数の条件分岐を行いたい場合はelse if
を使用できます。else if
はelse
とは異なり条件式を指定して処理を実行できます。またif文の上から順に条件式をチェックしていき、ある条件式で処理が実行されるとif文は終了します。
//書き方
if (条件式1) {
条件式1が真の場合の処理...
}else if (条件式2) {
条件式2が真の場合の処理...
}else{
条件式が偽の場合の処理...
}
//使用例
void main() {
int score = 73;
if (score >= 90) {
print('素晴らしい!!'); //偽なので処理は実行されない
} else if (score >= 70) {
print('合格です!'); //真なので処理が実行
} else {
print('不合格です...'); //別の条件式で処理が実行されてるので実行されない
}
}
///出力結果
//合格です!
switch文
- switch文ではある式の値に応じて異なる処理を指定できる
- 多分岐する場合はif文よりも扱いやすい
switch文はある式の値に応じて異なる処理を指定できる条件分岐です。
if文では条件式の結果(trueまたはfalse)によって処理を指定するのに対し、switch文は式(変数の値)の結果ごとに処理を指定できます。
» switch文の使い方|3つ以上の条件分岐
switch文の書き方
switch文は次のように記述します。
式の結果とcase:
の後の値が一致した場合に処理を実行し、break
に出会うとswitch文の処理を終了します。
また式の結果と値が一致しない場合はdefault:
の後に指定した処理が実行されます。
//書き方
switch (式) {
case 値1:
式の結果と値1が一致した場合の処理...
break;
case 値2:
式の結果と値2が一致した場合の処理...
break;
case 値3:
式の結果と値3が一致した場合の処理...
break;
default:
式の結果がどの値とも一致しない場合の処理...
}
//使用例
void main() {
int dice = 3;
switch (dice) {
case 1:
print('1の目が出ました');
break;
case 2:
print('2の目が出ました');
break;
case 3:
print('3の目が出ました'); //式と値が一致するので処理が実行
break; //処理が実行されたのでswtich文を抜ける
case 4:
print('4の目が出ました');
break;
case 5:
print('5の目が出ました');
break;
case 6:
print('6の目が出ました');
break;
default:
print('サイコロを振り直してください');
}
}
//出力結果
//3の目が出ました
三項演算子
- 三項演算子と2つの条件分岐を1行に簡略化できる
- if..else文の代用として活用できる
- 3つ以上の複雑な条件分岐では使用できない
三項演算子を使用することでif..else文など2つの条件分岐を簡略化できます。
本来なら複数行必要なコードを1行にまとめられますが、条件分岐が3つ以上の場合は使用できません。
» 三項演算子の使い方|if文を1行に簡略化
if..else文の場合
三項演算子を解説していく前に、まずはこちらのif..else文のコードをご覧ください。
if..else文では簡単な条件分岐でも複数行コードが必要となってしまいます。
//if..else文の場合
void main() {
int age = 18;
if(age >= 18){
print('成年');
}else{
print('未成年');
}
}
///出力結果
//成年
三項演算子の場合
三項演算子は次のように記述します。
if..else文と違い1行のコードでまとめることができます。
//書き方
条件式? 真の場合の処理: 偽の場合の処理
//使用例
void main() {
int age = 18;
print(age >= 18? '成年':'未成年');
}
///出力結果
//成年
for文
- for文では条件が真の間ずっと反復処理を実行できる
- あらかじめ繰り返す回数が決まっている場合に使用
- for..each文、for..in文で配列の要素を順に取得し処理できる
for文では条件が真の間ずっと同じ処理を繰り返す(反復処理)ことができます。
同じ反復処理にwhile文がありますが、for文ではあらかじめ繰り返す回数が決まっている場合に使用されます。
»【Flutter/Dart】for文|ループと反復処理
for文の書き方
for文は次のように記述します。
初期化式で定義した変数をfor文の処理内で使用できます。また{}
の中の処理が終了すると変化式が実行され、条件式が真の間は繰り返し処理が実行されます。
//書き方
for (初期化式; 条件式; 変化式) {
条件式が真の間の処理...
}
//使用例
void main() {
for (var i = 1; i < 5; i++) {
print('カウント$i');
}
}
//出力結果
//カウント1
//カウント2
//カウント3
//カウント4
for..in文の書き方
for..in文ではListなどの配列に格納されている要素を順に取得し、for..in文で宣言した変数に代入して反復処理で使用できます。
//書き方
for (var 変数 in 配列) {
処理...
}
//使用例
void main() {
var fruit = ['りんご', 'バナナ', 'グレープ', 'レモン'];
for (var item in fruit) {
print('$itemを取り出しました');
}
}
//出力結果
//りんごを取り出しました
//バナナを取り出しました
//グレープを取り出しました
//レモンを取り出しました
forEach文の書き方
forEach文ではfor..in文同様にListなどの配列に格納されている要素を順に取得し反復処理で使用できます。
forEach文は配列のメソッドになります。
//書き方
List名.forEach((変数)) {
処理...
}
//使用例
void main() {
var fruit = ['りんご', 'バナナ', 'グレープ', 'レモン'];
fruit.forEach((item) {
print('$itemを取り出しました');
});
}
//出力結果
//りんごを取り出しました
//バナナを取り出しました
//グレープを取り出しました
//レモンを取り出しました
while文
- whileでは条件が真の間ずっと反復処理を実行できる
- あらかじめ繰り返す回数が決まっていない場合に使用
- do..while文では処理の後に条件式を実行できる
while文では条件が真の間ずっと同じ処理を繰り返す(反復処理)ことができます。
同じ反復処理にfor文がありますが、while文ではあらかじめ繰り返す回数が決まっていない場合に使用されます。
»【Flutter/Dart】while文|ループと反復処理
while文の書き方
while文は次のように記述します。
条件式が真の間は反復処理を繰り返します。
//書き方
while (条件式) {
条件式が真の間の処理...
}
//使用例
void main() {
int count = 1;
while (count < 5) {
print('カウント$count');
count++;
}
}
//出力結果
//カウント1
//カウント2
//カウント3
//カウント4
do..while文の書き方
while文は反復処理が実行される前に条件式が評価されるのに対し、do..whileでは反復処理を実行した後で条件式を評価します。
よってdo..while文では反復処理で必ず一度は処理を行いたい場合に使用します。
//書き方
do {
条件式が真の間の処理...
} while (条件式);
//使用例
void main() {
int count = 1;
do {
print('カウント$count');
count++;
} while (count < 5);
}
//出力結果
//カウント1
//カウント2
//カウント3
//カウント4
List
- Listとは配列の一種で一連した複数のデータを格納できる
- 同じ値の要素を重複して格納できる
- 要素の位置ごとに連番(インデックス)が振り分けられる
Listとは配列の一種で一連した複数のデータを格納し、後から要素(データ)を取得したり追加したりできます。
またListに格納されたそれぞれの要素の位置(インデックス)は「0」からはじまる連番(0, 1, 2…)によって振り分けられます。
Listの配列の特徴として同じ値の要素を重複して格納できます。
» Listの使い方|初期化・追加・結合・削除
Listの定義
Listに格納する値は[]
の中に書き、,
で値と値を区切ります。
要素を取得する際は変数名[インデックス]
のように書きます。Listの連番は0から始まるので1つ目の要素を取得する場合は変数名[0]
のように書きます。
//書き方
List<データ型> 変数名 = [値1, 値2, 値3];
//要素の取得
変数名[インデックス];
//使用例
void main() {
List<String> alphabet = ['a', 'b', 'c', 'd'];
print(alphabet[0]); //Listから1つ目の要素を取得
print(alphabet[2]); //Listから3つ目の要素を取得
}
//出力結果
//a
//c
Set
- Setとは配列の一種で一連した複数のデータを格納できる
- 同じ値の要素を重複して格納できない
- Listのように要素ごとにインデックスはない
Setとは配列の一種で一連した複数のデータを格納し、後から要素(データ)を取得したり追加したりできます。
SetはListとは異なり同じ値の要素を重複して格納できず、また要素ごとにインデックスはありません。
Listとは配列の一種で一連した複数のデータを格納し、後から要素(データ)を取得したり追加したりできます。
またListに格納されたそれぞれの要素の位置(インデックス)は「0」からはじまる連番(0, 1, 2…)によって振り分けられます。
Listの配列の特徴として同じ値の要素を重複して格納できます。
» Setの使い方|初期化・追加・結合・削除
Setの定義
Setに格納する値は{}
の中に書き、,
で値と値を区切ります。
//書き方
Set<データ型> 変数名 = {値1, 値2, 値3};
//使用例
void main() {
Set<String> alphabet = {'a', 'b', 'c', 'd'};
alphabet.forEach((item) {
print(item);
});
}
//出力結果
//a
//b
//c
//d
Map
- Mapとは配列の一種で一連した複数のデータを格納できる
- キーと値を紐づけて配列に格納できる
Mapとは配列の一種でキーと値を紐づけて複数のデータを格納できます。
» Mapの使い方|初期化・追加・結合・削除
Mapの定義
MapではMap<キーの型, 値の型>
のように宣言します。
また{}
の中にキー: 値
のようにキーと値をセットで格納します。
//書き方
Map<キーの型, 値の型> 変数名 = {
キー1: 値1,
キー2: 値2,
キー3: 値3,
};
//要素の取得
変数名[キー];
//使用例
void main() {
Map<String, String> fruit = {
'a': 'apple',
'b': 'banana',
'c': 'cherry',
};
print(fruit['a']);
}
//出力結果
//apple
enum(列挙型)
- 一連する複数の定数を1つにまとめられる
列挙型では複数の異なる定数を一つの集合としてまとめられます。
使用例としては曜日や月など内容が変動しない複数の値を繰り返し使用する場合などで活用されます。またswitch文と組み合わせて使用されることが多いです。
» enum(列挙型)の使い方|複数の定数を1つにまとめる
列挙型の定義・呼び出し方
列挙型を定義する際はクラスのようにvoid関数の外で列挙名の1文字目を大文字にして定義します。
//定義
enum 列挙名 {
列挙子,
列挙子,
列挙子,
列挙子,
}
///呼び出し方
列挙名.列挙子
//使用例
void main() {
Enum day = Days.Wednesday;
switch (day) {
case Days.Sunday:
print('日曜日');
break;
case Days.Monday:
print('月曜日');
break;
case Days.Tuesday:
print('火曜日');
break;
case Days.Wednesday:
print('水曜日');
break;
case Days.Thursday:
print('木曜日');
break;
case Days.Friday:
print('金曜日');
break;
case Days.Saturday:
print('土曜日');
break;
default:
print('存在しない曜日です');
}
}
///出力結果
//水曜日