27
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

個人的に気になったDartの書き方

Last updated at Posted at 2019-04-30

はじめに

厳密さにかけているので、下記のドキュメントさらっと読むのが一番良いです。

A Tour of the Dart Languageと、Effective Dartを読みつつ、DartPad使って試すと良いかと。

基本

GoとかJavaと同じようにmain関数から処理が開始される。

変数、定数

Dartにはvar, dynamic, final, constがある。

var

var name = 'hoge';

varはJSのvarとは異なりTSのletのイメージが一番近いと思う。型が同じであれば再代入可能。
下記は可能。

var name = 'hoge';
name = 'fuga';

しかし、下記のように型が異なる場合には当然再代入できない。

var name = 'hoge';
name = 1; // 型が異なるため再代入できない

dynamic

dynamic name = 'hoge';

dynamicはJSのletのイメージが一番近いと思う。
型が異なっていても再代入可能。型は不定(dynamic型)になる。
下記すべて可能。

dynamic name = 'hoge';
name = 1;
name = 'fuga';

明示的型の記述

推論があるためあまり使わないかもしれないが、下記のようにも書ける。当然同一の型は再代入可能。

String name = 'hoge';
name = 'fuga';

final

final name = 'hoge';

JSのconstのイメージが一番近いと思う。Javaをあまり知らないがJavaのfinalに近いのかな?
再代入不可だが、参照先が変更される可能性はある。

下記は可能。

final List<int> list = [1, 2, 3];
print(list);

list[0] = 2;
print(list);

下記はできない。

final List<int> list = [1, 2, 3];
list = [3, 3, 3]; // 再代入できない。

const

再代入不可。参照先が変わることもない。

const name = 'hoge';

下記もできない。

const List<int> list = [1, 2, 3];
list[0] = 2;

デフォルト値(default value)

未初期化変数の初期値はすべてnull。

int count;

String name;

assert(count == name);

文字列結合と変数展開

下記のように改行した文字列は+で結合した文字列と同じになる。また変数展開はシングルクォーテーション、ダブルクォーテーション内で${}または$を用いる。

var name = 'Tarou '
           'Tanaka';

var lastName = 'Tanaka'

assert(name == 'Tarou' + lastName);
assert(name == 'Tarou ${Tanaka}');

オプションのパラメータ(optional parameters)

オプションの名前付きパラメータ(optional named parameters)

引数内で{}で囲むことで可能

String echo({ String word }) {
  print(word);
  return word;
}

echo(word: 'hello');
echo();

オプションの定位置パラメータ(optional poisitional parameters)

引数内で[]で囲むことで可能

String echo([String word]) {
  print(word);
  return word;
}

echo('hello');
echo();

型テスト演算子(type test operators)

as, is, is!がある。asはTypecastなのでTSのasと同じように捉えればよいかと。
is, is!はインタフェースを実装しているか否かで真偽値を返す。

dynamic name = 'hoge';
if (name is String) {
  print('string'); // stringと標準出力される
}

条件式(conditional expressions)

JSの||に近いものとしては??がある

String echo([String word]) {
  var nonNullWord = word ?? '';
  print(nonNullWord);
  return nonNullWord;
}

カスケード記法(cascade notation)

class Point {
  num x;
  num y;
}

var point = Point();
point..x = 1
     ..y = 2;

上記と下記は同じ

class Point {
  num x;
  num y;
}

var point = Point();
point.x = 1;
point.y = 2;

条件付きメンバーアクセス(conditional member access)

Rubyのぼっち演算子みたいなやつ。
下記の場合、pointがnullの場合にはnullを返し、pointがnullでない場合には、メンバーにアクセスする。

point?.x

例外処理

onを用いることで例外の種類ごとに対応可能

main() {
  try {
    hello();
  } on Exception catch (e) {
    print(e);
  }
}

void hello() {
  throw 'hogehoge';
}

コンストラクタ

省略記法

TSのparameter propertiesみたいなやつ

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);
}

名前付きコンストラクタ(named constructors)

class Point {
  num x, y;

  Point(this.x, this.y);

  Point.origin() {
    x = 0;
    y = 0;
  }
}

main() {
  var point = Point.origin();
}

他にも下記の部分が気になった

  • Constant constructors(immutableにできるってこと)
  • Factory constructors(そういうのがあるってこと)
  • getter setter(書き方)
  • Implicit interface(暗黙のインタフェース)
  • metadata(@requiredとか書けること)
  • mixin(withで書けること)

上記すべて押さえておけばとりあえず問題なく書けると思います。

参考文献

A Tour of the Dart Language

27
20
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?