A Tour of the Dart Languageを雑にまとめてみた

# A Tour of the Dart Languageを雑にまとめてみた
https://www.dartlang.org/guides/language/language-tour
これを見てDart言語について雑にまとめてみた。

## Important concepts　重要な概念
Dartの言語仕様

 - 変数に配置できるものはすべてオブジェクトである。関数,nullもオブジェクトである。
 - Dartは強く型付けされているが型推論できる
 - List<int>のようにジェネリクス型をサポートしている。 (Listに入れる方を制限)
 
## デフォルト値
初期化されていない変数の初期値はnull。
整数値型の変数も初期値はnullである。

## final と　const
変数を変更するつもりがない場合はfinal or constを使う
const変数はコンパイル時定数

```dart

final name = 'Bob'; 
final String nickname = 'Bobby';
const bar = 1000000; 
const double atm = 1.01325 * bar;
```

## ビルドインタイプ
- 数値
- 文字列
- bool
- リスト
- マップ
- ルーン (UTF-32コードポイント)
- シンボル

## 関数の引数
### 名前付きパラメータ
```dart
void enableFlags({bool bold, bool hidden}) {
  // ...
}
enableFlags(bold: true, hidden: false);
```
{}で囲むことで名前付き引数を定義できる

## オプション引数

```dart 
//device引数は呼び出し時になくても良い
String say(String from, String msg, [String device]) {
  // ...
}
```
[]で囲むことによってオプション引数になる。
[]で囲まれた引数は関数呼び出し時に指定しなくても呼ぶ出すことができる。
ほかの引数は指定しないとエラーになる

## デフォルト引数
dartはデフォルト引数もサポートしている

```dart 
void enableFlags({bool bold = false, bool hidden = false}) {
  // ...
}

String say(String from, String msg,
    [String device = 'carrier pigeon', String mood]) {
 //...
}

void doStuff(
    {List<int> list = const [1, 2, 3],
    Map<String, String> gifts = const {
      'first': 'paper',
      'second': 'cotton',
      'third': 'leather'
    }}) {
// ...
}
```

## カスケード表記
同一オブジェクトに対して一連の操作を行う。
一時変数を作成する必要がないので読みやすいコードになる。

```dart 
querySelector('#confirm')
  ..text = 'Confirm' 
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
```

## 条件付きメンバーアクセス

```dart 
foo?.bar
```
fooがnullの場合nullを返し、そうでない場合barにアクセスする。

## クラス
### コンストラクター
クラス名と同じ関数を宣言することでコンストラクターを宣言できる
インスタンス変数にコンストラクタ引数を割り当てるパターンは省略記法があるので、以下の様に書ける.
また、名前付きコンストラクタを定義してクラスのコンストラクタを複数定義することもできる.

```dart 
class Point {
  num x, y;

  Point(num x, num y) {
    this.x = x;
    this.y = y;
  }
}

class Point {
  num x, y;

  Point(this.x, this.y);

  // 名前付きコンストラクタ
  Point.origin() {
    x = 0;
    y = 0;
  }
}
```

スーパークラスのコンストラクタ、名前付きコンストラクタはサブクラスには継承されない。
なので、サブクラスで名前付きコンストラクタを使用する場合はそのコンストラクタをサブクラスに実装しないといけない。

### Initializer list
コンスタラクタ本体が実行される前にインスタンス変数を初期化する事もできる。
:でイニシャライザを区切る

```dart
// 名前付きコンストラクタ
Point.fromJson(Map<String, num> json)
    : x = json['x'],
      y = json['y'] {
  print('In Point.fromJson(): ($x, $y)');
}
```

### ゲッターセッター
ゲッターとセッターはオブジェクトのプロパティへの読み書きアクセスを提供するメソッド。それぞれのインスタンス変数には暗黙的にゲッターとセッターがあるが、getキーワードとsetキーワードを使用してgetter,setterを実装することもできる。

```dart 
class Rectangle {
  num left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  num get right => left + width;
  set right(num value) => left = value - width;
  num get bottom => top + height;
  set bottom(num value) => top = value - height;
}
```

### 抽象メソッド
```dart 
// 抽象クラス定義
abstract class Doer {
  void doSomething(); //抽象メソッド
}

class EffectiveDoer extends Doer {
  void doSomething() {
    // ...
  }
}
```
### クラス変数とクラスメソッド
staticキーワードを使用してクラス変数、クラスメソッド(静的変数、静的メソッド)を定義できる

```dart 
class Point {
  num x, y;
  Point(this.x, this.y);

  static num distanceBetween(Point a, Point b) {
   //...
  }
}

void main() {
  var distance = Point.distanceBetween(a, b);
}
```

## ライブラリの使用
importキーワードでライブラリを読み込むがオプションがいろいろ有る

asを用いることで接頭語を指定できる

```dart 
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

// Uses Element from lib1.
Element element1 = Element();

// Uses Element from lib2.
lib2.Element element2 = lib2.Element();
```

show,hideを使うことで一部だけの使用、不使用を指定できる

```dart 
// fooだけを読み込む
import 'package:lib1/lib1.dart' show foo;

// foo以外を読み込む
import 'package:lib2/lib2.dart' hide foo;
```