おとなしく Dart のお勉強【型】

Dart, プログラミング

Dart をちゃんと学ぶことにしたのでここにノートを記録しておきます。基本的には DartPad で書いています。私は基本的に Swift しか知らないので、Swift との相違点で気づいたこと、調べたことがあればコメントに書いています。

環境は Dart 2.3。今回はです。

Dart の組み込み型

数値型 – Numbers

var x = 1; // int
var hex = 0xDEADBEEF; // int

var y = 1.1; // double
var exponents = 1.42e5; // double

double z = 1; // double

num a = 2.0; // double ※ num = int & double
a = 10; // int ※エラーにはならない

文字列型と数値型の変換

var one = int.parse('1'); // String -> int
var onePointOne = double.parse('1.1'); // String -> double

String oneAsString = 1.toString(); // int -> String
String piAsString = 3.14159.toStringAsFixed(2); // double -> String

const変数同士の演算ならその結果もconst(?)

const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;

文字列型 – Strings

Dart は UTF-16。シングルクォーテーションかダブルクォーテーションで囲む。
\ でエスケープ。

var s1 = 'シングルクォーテーションで囲む';
var s2 = "ダブルクォーテーションで囲む";
var s3 = 'バックスラッシュで\'エスケープ\'できる';
var s4 = "違う符号を使ったほうが'簡単に'できる";

${expression} で文字列の中に式の値を入れることができる。Swift でいう \(expression)+演算子で文字列を連結できる。

var s = 'string interpolation';

print('Dart has $s, which is very handy.\n');
// Dart has string interpolation, which is very handy.

print('That deserves all caps. ' + '${s.toUpperCase()} is very handy!\n');
// That deserves all caps. STRING INTERPOLATION is very handy!


var s1 = 'この書き方なら'
    '改行しても'
    "機能します";
print(s1);
// この書き方なら改行しても機能します


var s2 = '''
複数行ならシングルクォーテーションを始点と終点に3回打つ。
''';
print(s2);
// 複数行ならシングルクォーテーションを始点と終点に3回打つ。

var s3 = """もしくはダブルクォーテーションを(ここで改行される)
始点と終点に3回打つ。""";
print(s3);
// もしくはダブルクォーテーションを(ここで改行される)
// 始点と終点に3回打つ。

符号の前にrをつけると、そのままの文字列を作成できる(例えば\nもそのまま\nとなる)。

var s = r'In a raw string, not even \n gets special treatment.';
print(s);
// In a raw string, not even \n gets special treatment.

null、数値、文字列、ブール値の const なら、それらで出来た文字列も const になる。

// OK
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
const validConstString = '$aConstNum $aConstBool $aConstString';


// NG
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];
const invalidConstString = '$aNum $aBool $aString $aConstList'; // エラー

ブーリアン型 – Booleans

var fullName = '';
print(fullName.isEmpty);
// true

var hitPoints = 0;
print(hitPoints <= 0);
// true

var unicorn;
print(unicorn == null);
// true

var iMeantToDoThis = 0 / 0;
print(iMeantToDoThis.isNaN);
// true

リスト(配列)- Lists

Swift で言う配列もリストで。順序が保証されたグループのオブジェクト。大体 JavaScript と同じ。

var list = [1, 2, 3]; // 型推論で List<int>

インデックス(添字)はゼロスタート。list[0]は最初の要素で、list[list.length - 1]が最後の要素。

var list = [1, 2, 3];
print(list.length);
// 3
print(list[1]);
// 2

list[1] = 1;
print(list[1]);
// 1
var constantList = const [1, 2, 3];
constantList[1] = 1; // const に入れようとしたのでエラー

スプレッド演算子

スプレッド演算子...と null対応スプレッド演算子...?で、例えばリストの全ての要素を別のリストに挿入できる。
スプレッド演算子の右辺が null の可能性があるなら、null対応スプレッド演算子を使う。

var list1 = [1, 2, 3];
var list2 = [0, ...list1];
print(list2.length);
// 4
  
var list3;
var list4 = [0, ...?list3];
print(list4.length);
// 1

collection if, collection for

条件や繰り返しを用いてコレクションを作成できる。

var promoActive = true;
var nav1 = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];
print(nav1);
// [Home, Furniture, Plants, Outlet]

promoActive = false;
var nav2 = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];
print(nav2);
// [Home, Furniture, Plants]

var listOfInts = [1, 2, 3];
var listOfStrings = [
  '#0',
  for (var i in listOfInts) '#$i'
];
print(listOfStrings);
// [#0, #1, #2, #3]

セット – Sets

Swift と同じで順番が保証されず、重複を許さないグループのオブジェクト。

var halogens = {'フッ素', '塩素', '臭素', 'ヨウ素', 'アスタチン'}; // 型推論で Set<String>

var names = <String>{}; // 空の Set<String>
Set<String> names2 = {}; //  空の Set<String>(上と同義)
var namesMap = {}; // これは set じゃなくて map(Map<dynamic, dynamic>)

add()addAll() メソッドでアイテムを追加、アイテムの数は .length を使う。

var halogens = {'フッ素', '塩素', '臭素', 'ヨウ素', 'アスタチン'};

var elements = <String>{};
elements.add('フッ素');
elements.addAll(halogens);
print(elements.length);
// 5
final constantSet = const {
  'フッ素', '塩素', '臭素', 'ヨウ素', 'アスタチン'
};
constantSet.add('ヘリウム'); // const に入れようとしたのでエラー

セットもリストと同じくスプレッド演算子、collection if、 collection for が使える。

マップ – Maps

Swift で言う辞書。key-valueで値を関連付けるオブジェクト。

リテラルを使うなら、

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
}; // 型推論で Map<String, String>

var nobleGases = {
  2: 'ヘリウム',
  10: 'ネオン',
  18: 'アルゴン',
}; // 型推論で Map<int, String>

コンストラクタを使うなら、

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map();
nobleGases[2] = 'ヘリウム';
nobleGases[10] = 'ネオン';
nobleGases[18] = 'アルゴン';

新しい key-value ペアを追加する方法、key から value を取得する方法は JavaScript と同じ。Swift とも同じ。存在しない key を入力すると null が返ってくる。アイテムの数は .length を使う。

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';

print(gifts['first']);
// partridge

print(gifts['fifth']);
// null

print(gifts.length);
// 2
final constantMap = const {
  2: 'ヘリウム',
  10: 'ネオン',
  18: 'アルゴン',
};

constantMap[2] = 'ヘリウム'; // const に入れようとしたのでエラー

マップもリストと同じくスプレッド演算子、collection if、 collection for が使える。

ルーン文字 – Runes (for expressing Unicode characters in a string)

Unicode の UTF-32 コードポイントを表現するならルーン文字を使う。基本は16進数で \uXXXX だが桁が4桁でない場合は例えば \u{1f600} のようにする。

var clapping = '\u{1f44f}';
print(clapping); // 👏
print(clapping.codeUnits); // [55357, 56399]
print(clapping.runes.toList()); // [128079]

Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
print(new String.fromCharCodes(input)); // ♥  😅  😎  👻  🖖  👍

参照