数据类型

Catalogue   

内置类型:

  • 数据类型:num
  • 字符串类型:String
  • 布尔类型:bool
  • 列表类型:list
  • 集合类型:Set
  • 映射类型:Map
  • Unicode:Runes
  • 标识符:Symbols

Numbers

Dart 中数字类型用于表示数字文字,Dart 中的数字类型分为整数和双精度数两种,整数值不大于64位, 具体取决于平台。

Dart支持两种Number类型:

  • int
  • double
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

int i = 11111;
double d = 123123123;

// String -> int
var one = int.parse('1');
assert(one == 1);

// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');

// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 | 4) == 7); // 0011 | 0100 == 0111
assert((3 & 4) == 0); // 0011 & 0100 == 0000

Strings

Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号或者双引号来创建字符串,单引号和双引号可以嵌套使用,否则需要使用\进行转义。字符串中也可以引用变量与表达式。

在字符串中,请以 ${表达式} 的形式使用表达式,如果表达式是一个标识符,可以省略掉 {}。如果表达式的结果为一个对象,则 Dart 会调用该对象的 toString 方法来获取一个字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var name = 'zhangsan';
//如果插入一个简单的标识符,而后面没有紧跟更多的字母数字文本,那么{}应该被省略。
var a = "my name is $name!";
var b = "my name is ${name.toUpperCase()}!";

var a = "my name is " "zhangsan";//多个字符串放一起拼接
var c = "my name is" + "zhangsan";//使用+拼接

//使用三个单引号或者双引号可以创建多行字符串对象
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

//提供一个 `r` 前缀可以创建一个 “原始 raw” 字符串
print(r"换行符:\n"); // 换行符:\n r:不需要转义
print("换行符:\\n"); // 换行符:\n

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.');

布尔类型

有一个名字为 bool 的类型。 只有两个对象是布尔类型的:truefalse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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中,数组(Array)由List对象表示
常用属性:

  • length:返回当前List的长度。
  • isEmpty:判断是否为空,返回bool类型的值。
  • isNotEmpty:判断是否为不空,返回bool类型的值。
  • reversed:倒序输出List中的值。输出结果并不是一个List,需要使用toList()方法将其在转换成List。

常用方法:

  • add(VALUE):向List中添加单个数据。
  • addAll([ARRAY]):以数组的形式向List中添加多个数据。
  • indexOf(ELEMENT):查找ELEMENT是否在List中。如果存在,返回其索引值;如果是不存在,返回 -1。
  • remove(ELEMENT):删除ELEMENT。
  • removeAt(INDEX):删除索引值为INDEX的值。
  • fillRange(START,END,[ VALUE]):将[START,END)范围内的值改为[VALUE]的值。
  • insert(INDEX,VALUE):在INDEX处插入VALUE。
  • insert(INDEX,LIST):在INDEX处插入LIST。
  • join(SYMBOL):以SYMBOL将LIST隔开,并以String类型返回。
  • STRING.split(SYMBOL):将字符串以SYMBOL进行切割,并以List类型返回。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var list = [1, 2, 3,]; //这个尾随逗号并不会影响集合,但它能有效避免「复制粘贴」的错误。
//Lists 的下标索引从 0 开始,第一个元素的索引是 0. list.length - 1 是最后一个元素的索引
print(list[list.length-1]);
//修改元素
list[0] = 2;

//使用new(实际上new可以省去)
var list = new List(1);
list[0] = 2;

//在 list 字面量之前添加 const 关键字,可以定义一个不变的 list 对象(编译时常量)
var list = const [1,2,3];
i.add(2); ///错误,list不可变

List<int> list2 = const [1,2,3];
// error
// list2.add(5);
list2 = [1,2,3,4];
print(list2);

const List<int> list3 = [4,5,6];
// list3.add(7);
// error
// list3 = [1,2,3,4];
print(list3);

Dart 在 2.3 引入了 扩展操作符(…)和 空感知扩展操作符(…?),它们提供了一种将多个元素插入集合的简洁方法。

例如,你可以使用扩展操作符(…)将一个 List 中的所有元素插入到另一个 List 中:

1
2
3
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

如果扩展操作符右边可能为 null ,你可以使用 null-aware 扩展操作符(…?)来避免产生异常:

1
2
3
var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

Dart 还同时引入了 集合中的 if 和 集合中的 for 操作,在构建集合时,可以使用条件判断 (if) 和循环 (for)。

1
2
3
4
5
6
7
8
9
10
11
12
13
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');

Maps

键值对相关的对象。 键和值可以是任何类型的对象。每个键只出现一次, 而一个值则可以出现多次。Dart 中 Map 提供了 Map 字面量以及 Map 类型两种形式的 Map。

Map的不同类型:

  • HashMap是无序的,这意味着它迭代的顺序是不确定的
  • LinkedHashMap按key的插入顺序进行迭代
  • SplayTreeMap按key的排序顺序进行迭代

当Map的一个操作正在执行的时候,通常不允许修改Map(添加或删除key)

1
2
3
4
5
6
7
8
9
10
11
12
13
//直接声明,用{}表示,里面写key和value,每组键值对中间用逗号隔开
var companys = {'a': '阿里巴巴', 't': '腾讯', 'b': '百度'};
var companys2 = new Map();
companys2['a'] = '阿里巴巴';
companys2['t'] = '腾讯';
companys2['b'] = '百度';

//添加元素
companys['j'] = '京东';
//获取与修改元素
var c = companys['c']; ///没有对应的key返回null
companys['a'] = 'alibaba';

Sets

在 Dart 中,set 是一组特定元素的无序集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

//可以使用在 {} 前加上类型参数的方式创建一个空的 Set,或者将 {} 赋值给一个 Set 类型的变量:

var names = <String>{};
// Set<String> names = {}; // This works, too.
// var names = {}; // Creates a map, not a set.


Set<String> set = {'aaa', 'bbb'};
for(var item in set) {
print(item);
}
set.forEach((element) {
print(element);
});

//是否包含元素
if (set.contains("aaa")) {
print("包含元素");
}
set.clear();

Runes

在 Dart 中,runes 公开了字符串的 Unicode 码位。使用 characters 包 来访问或者操作用户感知的字符,也被称为 Unicode (扩展) grapheme clusters。

如果需要获得特殊字符的Unicode编码,或者需要将32位的Unicode编码转换为字符串,就可以借助Runes类。

Dart表达Unicode代码点的常用方法是\uXXXX,其中XXXX是4位十六进制值。要指定多于或少于4个十六进制数字,需要将值放在大括号中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var clapping = '\u{1f44f}'; ///5个16进制 需要使用{}
print(clapping);//
//获得 16位代码单元
print(clapping.codeUnits); //[55357, 56399]
//获得unicode代码
print(clapping.runes.toList()); //[128079]

//fromCharCode 根据字符码创建字符串
print( String.fromCharCode(128079));
print( String.fromCharCodes(clapping.runes));
print( String.fromCharCodes([55357, 56399]));
print( String.fromCharCode(0x1f44f));

Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(String.fromCharCodes(input));


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');



Symbols

Symbol 表示 Dart 中声明的操作符或者标识符。 可以看作C中的宏。表示编译时的一个常量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var i = #A; //常量

main() {
print(i);
switch(i){
case #A:
print("A");
break;
case #B:
print("B");
break;

}
var b = Symbol("b");
print(#b == b); ///true
}

参考