概览

内建类型有如下种类 (写法不是这些):

  • numbers
  • strings
  • booleans
  • lists (数组)
  • sets
  • maps
  • runes (用于表示 unicode 字符串)
  • symbols

因为在 dart 中一切都是对象, 所以上面的类型都有构造器.

Numbers

数字类有两种, 它们都是 num 类的子类:

  • int
  • double

int

  • -2 ~ 2-1
  1. var x = 1;
  2. var hex = 0xDEADBEEF;

double

  • IEEE 754 标准
  1. var y = 1.1;
  2. var exponents = 1.42e5;
  • 从 dart 2.1 开始, int 可以自动转换为 double
  1. double z = 1; // Equivalent to double z = 1.0.

Strings

  • dart 的 string 是 UTF-16 的码点, 创建时使用 '"
  1. var s1 = 'Single quotes work well for string literals.';
  2. var s2 = "Double quotes work just as well.";
  3. var s3 = 'It\'s easy to escape the string delimiter.';
  4. var s4 = "It's even easier to use the other delimiter.";
  • 拼接字符串的方法
  1. // 相邻自动拼接
  2. var s1 = 'String '
  3. 'concatenation'
  4. " works even over line breaks.";
  5. assert(s1 ==
  6. 'String concatenation works even over '
  7. 'line breaks.');
  8. // 使用 + 号
  9. var s2 = 'The + operator ' + 'works, as well.';
  10. assert(s2 == 'The + operator works, as well.');
  • 多行字符串
  1. var s1 = '''
  2. You can create
  3. multi-line strings like this one.
  4. ''';
  5. var s2 = """This is also a
  6. multi-line string.""";
  • 创建 raw 字符串
  1. var s = r'In a raw string, not even \n gets special treatment.';

Booleans

bool 类, 有两个该类型的常量:

  • true
  • false
  1. // Check for an empty string.
  2. var fullName = '';
  3. assert(fullName.isEmpty);
  4. // Check for zero.
  5. var hitPoints = 0;
  6. assert(hitPoints <= 0);
  7. // Check for null.
  8. var unicorn;
  9. assert(unicorn == null);
  10. // Check for NaN.
  11. var iMeantToDoThis = 0 / 0;
  12. assert(iMeantToDoThis.isNaN);

Lists

  • 用字面量初始化
  • dart 自动推断类型, 类型不一致会抛出 error
  1. var list = [1, 2, 3];
  2. var list = [1, 2, 3];
  3. assert(list.length == 3);
  4. assert(list[1] == 2);
  5. list[1] = 1;
  6. assert(list[1] == 1);
  • dart 2.3 引入了 “spread operator” ... 和 “null-aware spread operator” ...? 来将元素插入到集合中
  1. // 使用 ...
  2. var list = [1, 2, 3];
  3. var list2 = [0, ...list];
  4. assert(list2.length == 4);
  5. // 使用 ...?
  6. var list;
  7. var list2 = [0, ...?list];
  8. assert(list2.length == 1);
  • dart 2.3 引入了 “collection if” 和 “collection for”
  1. // 控制集合元素的出现
  2. var nav = [
  3. 'Home',
  4. 'Furniture',
  5. 'Plants',
  6. if (promoActive) 'Outlet'
  7. ];
  8. // 控制集合元素的生成
  9. var listOfInts = [1, 2, 3];
  10. var listOfStrings = [
  11. '#0',
  12. for (var i in listOfInts) '#$i'
  13. ];
  14. assert(listOfStrings[1] == '#1');

Sets

  • 在 dart 中该类为 Set.
  • dart 自动推断元素类型
  1. var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
  • 创建空 Set 需要注意与创建 Map 的差别
  1. var names = <String>{};
  2. // Set<String> names = {}; // This works, too.
  3. // var names = {}; // Creates a map, not a set.
  • 添加
  1. var elements = <String>{};
  2. elements.add('fluorine');
  3. elements.addAll(halogens);
  • length
  1. var elements = <String>{};
  2. elements.add('fluorine');
  3. elements.addAll(halogens);
  4. assert(elements.length == 5);
  • 从 dart 2.3 开始, sets 支持 ... , ...? , collection if, collection for

Maps

在 dart 中该类型时 Map.

  • 字面量创建
  • 自动推断元素类型
  1. var gifts = {
  2. // Key: Value
  3. 'first': 'partridge',
  4. 'second': 'turtledoves',
  5. 'fifth': 'golden rings'
  6. };
  7. var nobleGases = {
  8. 2: 'helium',
  9. 10: 'neon',
  10. 18: 'argon',
  11. };
  • 构造器创建
  • 从 dart 2 开始, new 关键字时可选的
  1. var gifts = Map();
  2. gifts['first'] = 'partridge';
  3. gifts['second'] = 'turtledoves';
  4. gifts['fifth'] = 'golden rings';
  5. var nobleGases = Map();
  6. nobleGases[2] = 'helium';
  7. nobleGases[10] = 'neon';
  8. nobleGases[18] = 'argon';
  • 添加, 获取, 删除
  1. // 添加
  2. var gifts = {'first': 'partridge'};
  3. gifts['fourth'] = 'calling birds'; // Add a key-value pair
  4. // 获取
  5. var gifts = {'first': 'partridge'};
  6. assert(gifts['first'] == 'partridge');
  7. // 获取不到时返回 null
  8. var gifts = {'first': 'partridge'};
  9. assert(gifts['fifth'] == null);
  10. // length
  11. var gifts = {'first': 'partridge'};
  12. gifts['fourth'] = 'calling birds';
  13. assert(gifts.length == 2);
  14. // 删除
  15. gifts.removeXXX();
  • 从 dart 2.3 开始, 支持 ... , ...? , collection if, collection for

Runes and grapheme clusters

  • runes 暴露 unicode 码点
  • 从 dart 2.6 开始, 使用 characters 包来查看或操作 user-perceived 的字符 (Unicode (extended) grapheme clusters)
  • 在 dart 代码中表示 unicode 码点需要特殊方式: \uXXXX ; 多/少于4个16进制数字时使用花括号: \u{1f606}

获取最后一个:

  1. import 'package:characters/characters.dart';
  2. ...
  3. var hi = 'Hi 🇩🇰';
  4. print(hi);
  5. print('The end of the string: ${hi.substring(hi.length - 1)}');
  6. print('The last character: ${hi.characters.last}\n');

输出:

  1. $ dart bin/main.dart
  2. Hi 🇩🇰
  3. The end of the string: ???
  4. The last character: 🇩🇰

Symbols

Symbol 代表一个操作符或者标识符.

  • 获取一个标识符的 symbol
  1. #radix
  2. #bar
  • symbol 字面量是是编译时常量