型
基本型
全ての変数はオブジェクト。用意されている型は以下の通り。
- 数値型は int と double。
- int IS num, double IS num となる num型がある。
- 論理型は bool
- 文字列型は String
- リストは List<T>
- 連想配列は Map<K, V>
- Runes,Symbolもあり
Gneric型とdynamic
Generic型がある。
1 2 |
List<int> list = [1, 2, 3]; List<dynamic> list2 = ['a', 100, 3.14]; |
int, double など, どの型を使うか想定はあるが Dart言語で表現できない場合に dynami型を使う。
何型となるか想定がない場合, 全ての型の基底型である Objectを使う。
型推論
var で宣言して, 式の評価時に型を決める。
以下, x はforEachで初めて int であることが決まる。
1 2 |
var hoge = "hogehoge"; [1, 2, 3].forEach((x) => print(x*2)); |
変数
Non Null By Default (NNBD)
NNBDがOFFの場合、変数のデフォルト値は Null。
変数に Null を代入できるし, 変数は Nullになる可能性がある。
NNBDがONの場合、あえて指定しなければ Nullにすることはできない。
1 2 |
int x = Null; //コンパイルエラー int? x = Null; //OK |
FlutterでNNBDを有効にするには、
プロジェクトディレクトリの下にある analysis_options.yaml を書き換える。
1 2 3 |
analyzer: enable-experiment: - non-nullable |
finalとconst
finalを付けると変数宣言時以外で値が書き換わらないことを保証できる。
変数が指しているメモリが書き換わらないことは保証していないので、
例えば以下のようにfinalなListの要素を書き換えることはできる。
1 2 |
final List<int> l = [1,2,3]; l[1] = 10; //OK |
constを付けると値がコンパイル時に確定していることを表せる。
finalに加えて変数が指しているメモリが書き換わらないことも保証する。
1 2 |
const List<int> l = [1,2,3]; l[1] = 10; //ng |
可視性識別子
Dartには可視性識別子はない。プレフィックスとして _ を書くと可視性が下がる.
関数
基本形とシンタックスシュガー
関数の書き方。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
戻り値の型 functionName(引数の型 引数) { return 戻り値; } 戻りが式の場合、まとめて書ける。 戻り値の型 functionName(引数の型 引数) => 式; void main() { print(getReverseValue(true).toString()); print(getReverseValue2(true).toString()); } bool getReverseValue(bool x) { return !x; } bool getReverseValue2(bool x) => !x; |
名前付きパラメータ
引数に名前を付けて、呼ぶときに名前毎に値を渡せる。
名前付きパラメータは任意となる。
1 2 3 4 5 6 7 8 9 10 11 |
戻り値の型 functionName({引数の型 引数1, 引数の型 引数2}) { return 戻り値; } functionName(引数1: hoge, 引数2: fuga); void main() { print(myFunction(param1: 100, param2: "hoge")); print(myFunction(param1: 500)); // param2は任意だが myFunction内で参照してエラー } String myFunction({int param1, String param2}) => param1.toString() + param2; |