前回に引き続き、Dartの基礎を説明していきます。
今回紹介する内容は、前回よりも少しレベルアップした内容になります。
アロー関数
Dartにはアロー関数があり、短く1行で計算したり、その値などを返したりできます。
つまり{ return xxx; }の代わりに => xxxが使えるのです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
num divideNonLambda(num arg1, num arg2){ return arg1 / arg2; } num divideLambda(num arg1, num arg2) => arg1 / arg2; void main(){ print('non-lambda ${divideNonLambda(6, 2)}'); print('non-lambda ${divideNonLambda(9, 2)}'); print('non-lambda ${divideNonLambda(9, 2.5)}'); print('lambda ${divideLambda(6, 2)}'); print('lambda ${divideLambda(9, 2)}'); print('lambda ${divideLambda(9, 2.5)}'); } |
1 2 3 4 5 6 |
non-lambda 3 non-lambda 4.5 non-lambda 3.6 lambda 3 lambda 4.5 lambda 3.6 |
演算子のオーバーロード
Dartで一致するか比較するときは「=」ではなく「==」を用います。classが完全に一致するかを調べたいときは、演算子のオーバーロードをする必要がある場合があります。
例
car1 == car2のように2つのcarオブジェクトの一致を調べたい、つまり、「carのmakeとmodelが一致する」ことを確認したい場合は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Car{ String _make; String _model; String _imageSrc; Car(this._make, this._model, this._imageSrc); operator ==(other) =>other (other is Car) && (_make == other._make) && (_model == other._model); int get hashCode => _make.hashCode ^ _model.hashCode ^ _imageSrc.hashCode; } |
注意:ハッシュコード
「==」をオーバーロードする際に、「hashCode」もオーバーロードすることを覚えておきましょう。もしそれを忘れると、Frutterからwarningが出ます。
イコールや配列などのコレクションフレームワークはハッシュコードを使っているため、一緒にオーバーライドする必要があるのです。
リフレクション
リフレクションは、classやインターフェイス、フィールドなどを、メソッドなどの名前を知ることなく検査することができます。
Dartの「mirrors」というライブラリを使うことで、リフレクションを使うことができます。
Mixin(ミックスイン)
ミックスインは、他クラスの親にならずに、そこで使うためのメソッドを含んだクラスです。
コレクション
はじめに
開発を行う際、メモリに記憶されている情報を見ることになると思います。コレクションクラスを使うことで、それを調査したり、分類したり、挿入したり、操作したり、削除したりできます。
Dartでは、コレクションを、基のライブラリとコレクションライブラリの両方で提供しています。一般的なものは元のライブラリにあり、限定的、特徴的なものを使いたい場合はコレクションライブラリを使います。
リスト
リストは、並んだコレクションです。ほかの言語と違い、リストと配列は同じものとして結合できます。下の例で、リストが、通常は配列で使用される[]によってどのように宣言され、並び変えられるかを確認してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Person{ String _firstName; String _lastName; String _phone; Person(this._firstName, this._lastName, this._phone); toString(){ return "${_firstName} ${_lastName} ${_phone}"; } } void main(){ List<Person> list = [ Person("Mark", "Clow", "4043124462"), Person("Brant", "Sandermine", "4043124462"), Person("Phillip", "Perry", "4043124462"), ]; print("Not sorted: ${list}"); list.sort((a, b) => a._firstName.compareTo(b._firstName)); print("Sorted by first name: ${list}"); list.sort((a, b) => a._lastName.compareTo(b._lastName)); print("Sorted by last name: ${list}"); } |
1 2 3 |
Not sorted: [Mark Clow 4043124462, Brant Sandermine 4043124462, Phillip Perry 4043124462] Sorted by first name: [Brant Sandermine 4043124462, Mark Clow 4043124462, Phillip Perry 4043124462] Sorted by last name: [Mark Clow 4043124462, Phillip Perry 4043124462, Brant Sandermine 4043124462] |
Frutterはどこでもリストを使う
FrutterでUIコードを書くときは必ずリストで終わります。
下の例では、子ウィジェットを指定するためにリストを使っています。
1 2 3 4 5 6 7 8 9 10 |
chldren: <Widget>[ new Text( 'You have pushed the button this many times:', ), new Text( '$_counter', style: Theme.of(context).textTheme.display1, ), ], |
マップ
このオブジェクトはキーと値をマップ(紐づけ)します。この時のキーと値はどのようなタイプでも可能です。マップは動的なコレクションです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void main(){ Map<String, String> stateNamesByStateCode = {"AL": "Alamaba", "AK": "Alaska", "AR": "Arkansas", "AZ": "Arizona", }; stateNamesByStateCode["GA"] = "Georgia"; for (String key in stateNamesByStateCode.keys){ print(stateNamesByStateCode[key]); } print("\nGet just one: ${stateNamesByStateCode["AK"]}"); } |
1 2 3 4 5 6 7 |
Alamaba Alaska Arkansas Arizona Georgia Get just one: Alaska |
より特化したものを使うときは…
より特化したものを使いたい場合は、「dart:collection」ライブラリを使用します。
次のように書くことで、使えるようになります。
1 |
import 'dart:collection' |