おとなしく Dart のお勉強【型】
Dart をちゃんと学ぶことにしたのでここにノートを記録しておきます。基本的には DartPad で書いています。私は基本的に Swift しか知らないので、Swift との相違点で気づいたこと、調べたことがあればコメントに書いています。
環境は Dart 2.3。今回は型です。
Dart の組み込み型
- 数値型 – Numbers
- 文字列型 – Strings
- ブーリアン型 – Booleans
- リスト(配列)- Lists
- セット – Sets
- マップ – Maps
- ルーン文字 – Runes (for expressing Unicode characters in a string)
- シンボル型 – Symbols
数値型 – 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)); // ♥ 😅 😎 👻 🖖 👍