概览
内建类型有如下种类 (写法不是这些):
- 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 create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-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');
// 获取不到时返回 null
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
// length
var 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.dart
Hi 🇩🇰
The end of the string: ???
The last character: 🇩🇰
Symbols
Symbol 代表一个操作符或者标识符.
- 获取一个标识符的 symbol
#radix
#bar
- symbol 字面量是是编译时常量