概览
内建类型有如下种类 (写法不是这些):
- numbers
- strings
- booleans
- lists (数组)
- sets
- maps
- runes (用于表示 unicode 字符串)
- symbols
因为在 dart 中一切都是对象, 所以上面的类型都有构造器.
Numbers
数字类有两种, 它们都是 num 类的子类:
- int
- double
int
- -2 ~ 2-1
var x = 1;var hex = 0xDEADBEEF;
double
- IEEE 754 标准
var y = 1.1;var exponents = 1.42e5;
- 从 dart 2.1 开始, int 可以自动转换为 double
double z = 1; // Equivalent to double z = 1.0.
Strings
- dart 的 string 是 UTF-16 的码点, 创建时使用
'或"
var s1 = 'Single quotes work well for string literals.';var s2 = "Double quotes work just as well.";var s3 = 'It\'s easy to escape the string delimiter.';var s4 = "It's even easier to use the other delimiter.";
- 拼接字符串的方法
// 相邻自动拼接var s1 = 'String ''concatenation'" works even over line breaks.";assert(s1 =='String concatenation works even over ''line breaks.');// 使用 + 号var s2 = 'The + operator ' + 'works, as well.';assert(s2 == 'The + operator works, as well.');
- 多行字符串
var s1 = '''You can createmulti-line strings like this one.''';var s2 = """This is also amulti-line string.""";
- 创建 raw 字符串
var s = r'In a raw string, not even \n gets special treatment.';
Booleans
bool 类, 有两个该类型的常量:
- true
- false
// Check for an empty string.var fullName = '';assert(fullName.isEmpty);// Check for zero.var hitPoints = 0;assert(hitPoints <= 0);// Check for null.var unicorn;assert(unicorn == null);// Check for NaN.var iMeantToDoThis = 0 / 0;assert(iMeantToDoThis.isNaN);
Lists
- 用字面量初始化
- dart 自动推断类型, 类型不一致会抛出 error
var list = [1, 2, 3];var list = [1, 2, 3];assert(list.length == 3);assert(list[1] == 2);list[1] = 1;assert(list[1] == 1);
- dart 2.3 引入了 “spread operator”
...和 “null-aware spread operator”...?来将元素插入到集合中
// 使用 ...var list = [1, 2, 3];var list2 = [0, ...list];assert(list2.length == 4);// 使用 ...?var list;var list2 = [0, ...?list];assert(list2.length == 1);
- dart 2.3 引入了 “collection if” 和 “collection for”
// 控制集合元素的出现var nav = ['Home','Furniture','Plants',if (promoActive) 'Outlet'];// 控制集合元素的生成var listOfInts = [1, 2, 3];var listOfStrings = ['#0',for (var i in listOfInts) '#$i'];assert(listOfStrings[1] == '#1');
Sets
- 在 dart 中该类为 Set.
- dart 自动推断元素类型
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
- 创建空 Set 需要注意与创建 Map 的差别
var names = <String>{};// Set<String> names = {}; // This works, too.// var names = {}; // Creates a map, not a set.
- 添加
var elements = <String>{};elements.add('fluorine');elements.addAll(halogens);
- length
var elements = <String>{};elements.add('fluorine');elements.addAll(halogens);assert(elements.length == 5);
- 从 dart 2.3 开始, sets 支持
...,...?, collection if, collection for
Maps
在 dart 中该类型时 Map.
- 字面量创建
- 自动推断元素类型
var gifts = {// Key: Value'first': 'partridge','second': 'turtledoves','fifth': 'golden rings'};var nobleGases = {2: 'helium',10: 'neon',18: 'argon',};
- 构造器创建
- 从 dart 2 开始, new 关键字时可选的
var gifts = Map();gifts['first'] = 'partridge';gifts['second'] = 'turtledoves';gifts['fifth'] = 'golden rings';var nobleGases = Map();nobleGases[2] = 'helium';nobleGases[10] = 'neon';nobleGases[18] = 'argon';
- 添加, 获取, 删除
// 添加var gifts = {'first': 'partridge'};gifts['fourth'] = 'calling birds'; // Add a key-value pair// 获取var gifts = {'first': 'partridge'};assert(gifts['first'] == 'partridge');// 获取不到时返回 nullvar gifts = {'first': 'partridge'};assert(gifts['fifth'] == null);// lengthvar gifts = {'first': 'partridge'};gifts['fourth'] = 'calling birds';assert(gifts.length == 2);// 删除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}
获取最后一个:
import 'package:characters/characters.dart';...var hi = 'Hi 🇩🇰';print(hi);print('The end of the string: ${hi.substring(hi.length - 1)}');print('The last character: ${hi.characters.last}\n');
输出:
$ dart bin/main.dartHi 🇩🇰The end of the string: ???The last character: 🇩🇰
Symbols
Symbol 代表一个操作符或者标识符.
- 获取一个标识符的 symbol
#radix#bar
- symbol 字面量是是编译时常量
