Dart的内置类型
在Dart中所有变量的引用都是对象,即一个类的实例,你也可以使用构造函数初始化变量,很多内置类型都有自己的构造函数,比如可以使用 Map() 构造函数创建一个映射。,我们将说明Dart内置类型作用以及使用方法
你可以初始化一个对象使用指定类型的字面量,比如 'this is a string'
是一个字符串, true
是布尔值。
这是因为在Dart中所有变量的引用都是对象,即一个类的实例,你也可以使用构造函数初始化变量,很多内置类型都有自己的构造函数,比如可以使用 Map()
构造函数创建一个映射。
在本文中,我们将说明Dart内置类型作用以及使用方法。
Numbers
Dart中numbers类型有两种变体, int
和 double
int
整形值最大不超过64位,这依赖与平台而确定,在Dart VM,指可以是从-263 到 263 。Dart也可以编译为javascript,允许的值是从 -253 到 253 - 1
double
64位浮点数,符合IEEE 754 标准规范
int
和了double
都是num
的子类,num
类型都有基本的操作符,你可以使用这些操作符进行运算,详细请参考dart:math数学库
var x = 1;
var hex = 0xDEADBEEF;
在Dart 2.1,整形变量会自动转换为浮点数,当在需要的时候
double z = 1; // 相当于 double z = 1.0.
转换字符串为数值
// 字符串 -> 整型
var one = int.parse('1');
assert(one == 1);
// 字符串 -> 浮点数
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// 整形 -> 字符串
String oneAsString = 1.toString();
assert(oneAsString == '1');
// 浮点数 -> 字符串
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
数值位运算
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
String
Dart字符串是UTF-16编码单元序列,可以使用单引号或者双引号创建字符串
var s1 = '单引号.';
var s2 = "双引号.";
var s3 = 'It\'转义字符串分界符.';
var s4 = "It'可以包含其它分界符.";
你也可以通过使用 ${expression}
将一个表达式插入字符串中,如果表达式是一个标识符则不需要{},来获得一个对象的字符串,Dart会自动调用对象的 toString()
方法
var s = 'string interpolation';
assert('Dart has $s, which is very handy.' ==
'Dart has string interpolation, ' +
'which is very handy.');
assert('That deserves all caps. ' +
'${s.toUpperCase()} is very handy!' ==
'That deserves all caps. ' +
'STRING INTERPOLATION is very handy!');
使用+连接字符串
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.""";
通过前缀r
创建一个Runes字符串
var s = r'In a raw string, not even \n gets special treatment.';
布尔值
布尔值是Dart内置的类型,有两个对象
布尔值是Dart内置的类型,仅有两个对象true
与false
,都是编译时常量,Dart是类型安全语言,这意味你不能像if (非布尔值)
来进行判断
// 检查空字符串
var fullName = '';
assert(fullName.isEmpty);
// 是否等于0.
var hitPoints = 0;
assert(hitPoints <= 0);
// 是否为null.
var unicorn;
assert(unicorn == null);
// 是否是NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
Lists
在很多编程语言中都有数组的存在。但在Dart中数组是列表对象,很多人都称为列表,Dart列表很像javascript的数组
var list = [1, 2, 3];
上面示例中Dart尝试将list变量的类型推断为List<int>
,如果你尝试添加一个非整型的元素,Dart会抛出一个运行时的错误
列表从0开始索引,列表第一个索引是0,最后一个索引是 list.length - 1
,你可以像javascript一样获取列表的元素或者长度
var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
在Dart 2.3引入了扩展运算符(...)
和空值感知扩展运算符(......?)
,它提供了一种将多个元素插入列表的简洁方法。
var list;
var list2 = [0, ...?list];
assert(list2.length == 1);
如果...
扩展符右则变量为空时,可以使用?
判定是否为空,当为空则不会插入
var list;
var list2 = [0, ...?list];
assert(list2.length == 1);
Dart 2.3 引入 collection if 和 collection for, 可以直接在列表中使用 (if
) 和 (for
).判断后加入元素
// if
var nav = [
'Home',
'Furniture',
'Plants',
if (promoActive) 'Outlet'
];
// for
var listOfInts = [1, 2, 3];
var listOfStrings = [
'#0',
for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');
Sets
Dart中集合是无序唯一元素的组合,可以通过集合的字面量和Set的构造函数初始化。
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
上面的示例中Dart会推断变量 halogens
是类型 Set<String>
请不要尝试添加,非字符串元素
创建空的集合
var names = <String>{};
// Set<String> names = {}; // 同上.
// var names = {}; // 创建映射不是集合.
Map 字面量语法与Set的字面量语法很相似,因为Map是最先出现的,因此 {}
是 Map
的类型,如果你忘记在 {}
添加类型声明,Dart会创建类型是 Map<dynamic, dynamic>
的映射
添加元素到集合,获取集合的长度
// 添加
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
//获取长度
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);
在Dart 2.3,集合也支持扩展运算符 (...
and ...?
), 就像列表一样
Map
映射是一个键值对的对象,键值都可以是任意类型的对象,每个键在映射只会出现一次,可以绑定相同的值到不同键名上。Dart可以通过map字面量和Map的构造函数初始化映射
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
Dart 推断 gifts
变量的类型是 Map<String, String>
请不要尝试添加其它类型
通过构造函数创建Map
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';
在Dart2构造函数需要添加new关键词,之后就是可选的
添加键值对到Map
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
获取Map指定键的值
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
如果指定键名在Map找不到值则返回null
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
获取Map的长度
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
在Dart 2.3,Map也支持扩展运算符 (...
and ...?
), 就像列表一样
Runes
在Dart中,runes是 UTF-32编码字符串
Unicode为世界上所有书写系统中使用的每个字母,数字和符号定义唯一的数值。由于Dart字符串是UTF-16代码单元的序列,因此在字符串中表示32位Unicode值需要特殊语法。
Symbols
一个Symbol对象表示一个操作符或者标识符,您可能永远不需要使用Symbol,但它们对于按名称引用标识符的API非常有用,因为缩写会更改标识符名称而不会更改标识符符号
获取标识符的符号
#radix
#bar