Dart中除了使用var,Object和dynamic声明变量,数据本身是由类型的,Dart中也可以直接使用数据类型进行更准确的类型声明。
Dart中数据类型
类型 | 说明 |
---|---|
num | 数字,包含int(整数)和double(浮点数) |
String | 字符串 |
bool | 布尔,逻辑true或false |
List | 数组/list集合 |
Set | set集合 |
Map | map集合 |
Runes | 符号,Unicode字符 |
Symbole | 标示 |
1. num类型
num类型是数字类型的父类,它包含了两个子类
- int
- double
num类型还包含了常规四则运算的各种操作符的定义。
num a = 32;
num b = 3.14;
num c = a + b;
print(c); //35.14
1.1 int类型
int类型表示的是整数类型。根据平台的不同,整数值不大于64位。
- 在Dart VM上,值可以从-263到263 - 1
- 编译成JavaScript的Dart使用JavaScript代码,允许值从-253到253- 1。
int a = 32;
int b = 3;
int c = a + b;
print(c); // 35
int a = 0xA; //十六进制
int b = 3;
int c = a + b;
print(c); // 13
int类型的API
API属性 | 返回值类型 | 说明 |
---|---|---|
bitLength | int | 变量占用bit位数 |
hashcode | int | hash码 |
isEven | bool | 是否为偶数 |
isOdd | bool | 是否为奇数 |
isFinite | bool | 是否为有限数字(非无穷大) |
isInfinite | bool | 是否为无限数字(无穷大) |
isNegative | bool | 是否为负数 |
isNaN | bool | 是否为非数 |
runtimeType | Type | 当前对象的运行类型 |
sign | int | 当前对象的符号。取值为-1,0,1 |
API方法 | 返回值类型 | 说明 |
---|---|---|
abs() | int | 当前变量绝对值 |
clamp(int n1, int n2); | num | 获得[n1,n2]区间距离当前变量最近的数字(n1 <= n2) |
compareTo(int n) | int | 当前变量与n比较,根据比较结果返回-1,0,1 |
gcd(int n) | int | 当前变量与n的最大公约数 |
modPow(int n1, int n2) | int | 当前变量的n1次幂后,与n2取余 |
remainder(int n) | int | 当前变量与n取余后的结果 |
toDouble() | double | 当前变量的double类型表示 |
toRadixString(int n) | String | 当前变量转换至n进制的字符串表示 |
toString() | String | 当前变量的字符串表示 |
toStringAsExponential(int n) | String | 当前变量的*10n科学计数的字符串表示 |
toStringAsFixed(int n) | String | 当前变量带有n个小数位的字符串表示 |
toStringAsPrecision(int n) | String | 当前变量带有n个数位的字符串表示 |
int类型API示例
int a = 123; //二进制数字 00000000 01111011
print("${a.bitLength}"); //占用了7bit
print("${a.isEven}"); //false 不是偶数
print("${a.isNegative}"); //false 不是负数
print("${a.toRadixString(16)}"); //7b 16进制是0x7b
print("${a.clamp(23, 78)}"); //78 最近的数字是78
print("${a.gcd(9)}"); //3 最大公约数是3
print("${a.remainder(2)}"); //1 与2取余得到1
1.2 double类型
Dart的double是IEEE 754标准中规定的64位浮点数。
- double类里面有一个常量maxFinite,可以得到double类型的最大值
- double类里面有一个常量minPositive,可以得到double类型的最小值
print(double.maxFinite);
print(double.minPositive);
如果一个num包含小数,那么它就是一个double类型。
double n1 = 3.14;
double n2 = 3.14e3;
print(n1); //3.14
print(n2); /3140.0;
double类型的API
API属性 | 返回值类型 | 说明 |
---|---|---|
hashcode | int | hash码 |
isFinite | bool | 是否为有限数字(非无穷大) |
isInfinite | bool | 是否为无限数字(无穷大) |
isNegative | bool | 是否为负数 |
isNaN | bool | 是否为非数 |
runtimeType | Type | 当前对象的运行类型 |
sign | int | 当前对象的符号。取值为-1,0,1 |
API方法 | 返回值类型 | 说明 |
---|---|---|
abs() | double | 当前变量绝对值 |
clamp(int n1, int n2); | num | 获得[n1,n2]区间距离当前变量最近的数字(n1 <= n2) |
compareTo(int n) | int | 当前变量与n比较,根据比较结果返回-1,0,1 |
remainder(int n) | double | 当前变量与n取余后的结果 |
round() | int | 当前变量四舍五入后的取整结果 |
roundToDouble() | double | 当前变量四舍五入后的取整结果,浮点数形式表示 |
ceil() | int | 比当前变量大的最小整数(进一法) |
ceilToDouble() | double | 比当前变量大的最小整数(进一法),浮点数形式表示 |
floor() | int | 比当前变量小的最大整数(退一法) |
floorToDouble() | double | 比当前变量小的最大整数(退一法),浮点数形式表示 |
truncate() | int | 舍弃当前变量的小数部分 |
truncateToDouble() | double | 舍弃当前变量的小数部分,浮点数形式表示 |
toInt() | int | 当前变量转换为int类型(舍弃浮点数部分) |
toString() | String | 当前变量的字符串表示 |
toStringAsExponential(int n) | String | 当前变量的*10n科学计数的字符串表示 |
toStringAsFixed(int n) | String | 当前变量带有n个小数位的字符串表示 |
toStringAsPrecision(int n) | String | 当前变量带有n个数位的字符串表示 |
double类型API示例
double a = 17.99;
print("${a.floor()}"); //12 退一法
print("${a.ceil()}"); //13 进一法
print("${a.round()}"); //13 四舍五入
print("${a.remainder(4)}"); //0.9900000000000002 与4取余,浮点数有个精度的尾巴
print("${a.isNegative}"); //false 不是负数
print("${a.toStringAsExponential(3)}"); //1.299e+1 科学计数法表示
通过int类型的API将int类型转换为double类型
int a = 32;
double b = a.toDouble();
print(b); //32.0
通过double类型的API将double类型转换为int类型(舍弃小数部分)
double a = 3.14;
int b = a.toInt();
print(b); //3
2. String类型
- Dart里面的String使用UTF-16字符集编码。
- 可以使用单引号或双引号来创建一个字符串,但必须成对使用。
- 单引号或者双引号里面嵌套使用引号。
- 用{}来显示字符串中变量的值,如果是表达式需要使用${表达式}
2.1 String字符常量
使用双引号或单引号创建字符串
String str1 = "I like girl";
String str2 = 'I like gril';
引号的嵌套使用,引号使用\"或\'进行转义
String str1 = "say:'Hello World!'";
String str2 = 'say:"Hello World!"';
String str3 = "say:\"Hello World!\"";
String str4 = 'say:\'Hello World!\'';
多行文本,使用三引号('''或""")
String str = '''多行文本测试1
测试2
测试3''';
使用+进行文本的拼接
String s1 = "hello";
String s2 = "world";
print(s1+" "+s2);
String类型的API
API属性 | 返回值类型 | 说明 |
---|---|---|
length | int | 字符个数 |
hashcode | int | 哈希码 |
isEmpty | bool | 是否为空字符串,不能进行null检测 |
isNotEmpty | bool | 是否为非空字符串,不能进行null检测 |
codeUnits | List |
字符序列的ASC码组成的集合 |
runtimeType | Type | 当前对象的运行类型 |
runes | Runes | 字符序列的ASC码组成的序列 |
API方法 | 返回值类型 | 说明 |
---|---|---|
codeUnitAt(int n) | int | 位置是n的字符的ASC码 |
compareTo(String str) | int | 字符串与str比较,根据比较结果返回-1,0,1 |
contains(String str, int n) | bool | 字符串中从n位置起是否包含str子串,省略参数n表示从位置0起 |
startsWith(String str) | bool | 字符串是否以子串str开始 |
endWith(String str) | bool | 字符串是否以子串str结束 |
indexOf(String str, int n) | int | 字符串第n个位置起,str第一次出现的位置,若没有出现过,返回-1。省略参数n表示从位置0起 |
lastIndexOf(String str, int n) | int | 字符串第n个位置起,str最后一次出现的位置,若没有出现过,返回-1。省略参数n表示从位置0起 |
padLeft(int n, String str) | String | 使用str在字符串的左侧将字符串补齐至n个长度(str无论多长只算1个长度),省略str参数表示使用空格(" ")进行补齐。 |
padRight(int n, String str) | String | 使用str在字符串的右侧将字符串补齐至n个长度(str无论多长只算1个长度),省略str参数表示使用空格(" ")进行补齐。 |
replaceAll(String str1, String str2) | String | 使用str2替换字符串中所有的str1子串 |
replaceRange(int n1, int n2, String str) | String | 使用str替换字符串中位置是[n1,n2)的子串 |
split(String str) | List |
以str为分隔符将字符串分隔为字符串集合 |
substring(int n1, int n2) | String | 截取字符串[n1,n2)区间的子串,省略n2参数表示截取至字符串的结尾 |
toLowerCase() | String | 将字符串中所有存在大小写的字符全部转换为小写字母 |
toUpperCase() | String | 将字符串中所有存在大小写的字符全部转换为大写字母 |
trim() | String | 去掉字符串两端多余的空白字符(如:空格) |
trimLeft() | String | 去掉字符串左侧多余的空白字符(如:空格) |
trimRight() | String | 去掉字符串右侧多余的空白字符(如:空格) |
String类型API示例
String s = "I like girl";
print("${s.codeUnitAt(0)}"); //字符I的ASC码:73
print("${s.indexOf('i')}"); //字符i第一次出现的位置3
print("${s.lastIndexOf('i')}"); //字符i最后一次出现的位置8
print("${s.substring(2,6)}"); //截取[2,6) 得到like
print("${s.contains('girl')}"); //是否包含girl true
print("${s.endsWith('girl')}"); //是否以girl结尾 true
print("${s.toUpperCase()}"); //全部大写 I LIKE GIRL
print("${s.split(' ')}"); //以空格拆分字符串得到集合 [I, like, girl]
2.2 StringBuffer字符变量
StringBuffer是字符串变量,参照Java语言中的StringBuffer类理解,主要用于字符串拼接操作
StringBuffer类型的API
API属性 | 返回值类型 | 说明 |
---|---|---|
length | int | 字符个数 |
hashcode | int | 哈希码 |
isEmpty | bool | 是否为空字符串,不能进行null检测 |
isNotEmpty | bool | 是否为非空字符串,不能进行null检测 |
runtimeType | Type | 当前对象的运行类型 |
API方法 | 返回值类型 | 说明 |
---|---|---|
write(Object obj) | void | 在字符串结尾处拼接obj |
writeln(Object obj) | void | 在字符串结尾处拼接obj后,换行 |
writeCharCode(int n) | void | 在字符串结尾处拼接以n为ASC码的字符 |
toString() | String | 将StringBuffer作为String返回 |
StringBuffer类型API示例
StringBuffer s = new StringBuffer();
s.write("Dart");
s.write("is");
s.writeln("fun!");
s.writeCharCode(97);
s.write(12);
print(s.toString());
print("${s.isEmpty}");
print("${s.isNotEmpty}");
print("${s.length}");
运行结果
3. bool类型
表示逻辑的真或假,其对应取值为
- true 表示逻辑真
- false 表示逻辑假
Dart的bool类型不像JavaScript语言中的boolean类型可以参与数值运算。
与Java语言中的boolean是一样的,不能参与类型转换同时也不参与数值运算。
bool b1 = true;
bool b2 = false;
4. List类型
Dart语言中的List类型结合了Java语言中集合和数组的优势,即可以使用下标直接访问,又提供了很多便利的API方法进行集合操作。
List可以分为变长方式和定长方式,分别对应Java语言中的集合和数组。它们的区别在于初始化集合时是否给定长度,操作也与集合和数组更靠近。
4.1 数组方式的List变量
数组的特点是定长,所以在声明List变量时给定初始长度,即认为List变量为数组。
声明数组式的List变量
List l1 = [1,2,3]; //声明一个长度是3的数组,初始化数据为1,2,3。
List l2 = new List(5); //声明一个长度是5的数组,数组的数据全部是null
操作数组式的List变量
通过下标直接对数组
List l2 = new List(5);
l2[0] = 32;
l2[1] = 33;
不能使用add方法向数组中赋值
List l2 = new List(5);
l2.add(32); //运行异常
l2.add(33); //运行异常
遍历数组
length属性可以得到数组长度
List l1 = [1,2,3];
for(int i = 0; i < l1.length; i++){
print(l1[i]);
}
4.2 集合方式的List变量
集合的特点在于变长,在声明List变量时不给定初始长度,则认为变量为集合。
声明集合式List变量
List list = new List(); //不给定长度
操作集合式List变量
通过add方法向集合的结尾处添加数据
List list = new List();
list.add(33);
list.add(23);
在集合对应位置没有添加数据时,不能使用下标直接对集合赋值
但集合对应位置已有数据时,可以使用下标进行访问
List list = new List();
list.add(33); //位置0,数据33
list[0] = 13; //设置位置0数据为13 OK
list[1] = 32; //运行错误,位置1没有数据
遍历集合
List list = new List();
list.add(33);
list.add(4);
list.add(22);
list.add(18);
for(int i = 0; i < list.length; i++){
print(list[i]);
}
4.3 List的API
API属性 | 返回值类型 | 说明 |
---|---|---|
length | int | List对象的长度/元素个数 |
first | E | List中的第一个元素 |
last | E | List中的最后一个元素 |
isEmpty | bool | 集合是否为空,不能进行null检测 |
isNotEmpty | bool | 集合是否非空,不能进行null检测 |
hashcode | int | 哈希码 |
runtimeType | Type | 当前对象的运行类型 |
iterator | Iterator | 获得当前List的迭代器 |
reversed | Iterable | 获得当前List的倒序可迭代对象 |
single | int | 若当前List只有一个元素,则返回这个元素,若有多个元素则运行异常 |
API方法 | 返回值类型 | 说明 |
---|---|---|
add(E obj) | void | 在List结尾处添加obj |
addAll(Iterable obj) | void | 在List结尾处添加obj, obj为一个可迭代的对象 |
asMap() | Map | 使用下标和数据作为key-value,将List转换成Map |
clear() | void | 清空List中的数据 |
contains(E obj) | bool | List中是否包含obj |
elementAt(int n) | E | 获得List中,位置是n的数据 |
getRange(int n1, int n2) | Iterable | 获得List中[n1,n2)位置所有数据组成的可迭代对象 |
indexOf(E obj, int n) | int | 在List中的第n个位置起,寻找obj第一次出现的位置,省略参数n表示从0开始,没有找到obj返回-1 |
lastIndexOf(E obj, int n) | int | 在List中的第n个位置起,寻找obj最后一次出现的位置,省略参数n表示从0开始,没有找到obj返回-1 |
insert(E obj, int n) | void | 在List的第n个位置,插入数据obj |
remove(E obj) | bool | 移除List中第一个obj,obj存在返回true,obj不存在返回false |
removeAt(int n) | E | 移除并返回List中第n个位置上的元素 |
removeLast() | E | 移除并返回List结尾的元素 |
removeRange(int n1,int n2) | void | 移除List中[n1,n2)位置的所有数据 |
skip(int n) | Iterable | 获得跳过起始n个元素的可迭代对象 |
take(int n) | Iterable | 获得起始n个元素的可迭代对象 |
toSet() | Set | 将List对象转储为Set,List中重复的数据只保留一个 |
5. Set类型
Dart中的Set类型类似Java中的Set集合,但区别的是Java中的Set集合被称为“无序(号)不重复”,通常在数据中存储的顺序由实现类(HashSet或TreeSet等)实现。而Dart中的Set集合按照存储顺序存放,不能存放重复数据,但可以通过elementAt方法根据序号访问。
Set不可使用下标直接访问,不能直接创建定长的对象。
Set set = new Set();
set.add(13);
set.add(4);
set.add(14);
set.add(24);
set.add(14);
set.add(11);
var s = set.elementAt(2); //访问位置2的元素
print(s);
print(set);
运行结果
Set的API
API属性 | 返回值类型 | 说明 |
---|---|---|
length | int | Set对象的元素个数 |
first | E | Set中的第一个元素 |
last | E | Set中的最后一个元素 |
isEmpty | bool | 集合是否为空,不能进行null检测 |
isNotEmpty | bool | 集合是否非空,不能进行null检测 |
hashcode | int | 哈希码 |
runtimeType | Type | 当前对象的运行类型 |
iterator | Iterator | 获得当前Set的迭代器 |
reversed | Iterable | 获得当前Set的倒序可迭代对象 |
single | int | 若当前Set只有一个元素,则返回这个元素,若有多个元素则运行异常 |
API方法 | 返回值类型 | 说明 |
---|---|---|
add(E obj) | void | 在Set结尾处添加obj |
addAll(Iterable obj) | void | 在Set结尾处添加obj, obj为一个可迭代的对象 |
clear() | void | 清空Set中的数据 |
contains(E obj) | bool | Set中是否包含obj |
difference(Set s) | Set |
返回当前Set对象没有在参数集合s中出现的元素所组成的新的Set集合 |
elementAt(int n) | E | 获得Set中,位置是n的数据 |
remove(E obj) | bool | 移除Set中的obj,obj存在返回true,obj不存在返回false |
skip(int n) | Iterable | 获得跳过起始n个元素的可迭代对象 |
take(int n) | Iterable | 获得起始n个元素的可迭代对象 |
toList() | List | 将Set对象转储为List |
6. Map类型
Map类型是一种key-value形式存储数据的的类型,其中key值不能重复。
6.1 基本操作
创建map集合
Map map = new Map();
Map map = new Map();
添加和更新数据
Map map = new Map();
map[12] = "value"; //12为key “value”是值 若key在集合中不存在,新增
map[12] = "test"; //key在集合中 存在,替换
print(map);
运行结果
删除数据
map.remove(12); //移除key是12的数据
6.2 Map类型的API
API属性 | 返回值类型 | 说明 |
---|---|---|
length | int | Map对象的键值对个数 |
entries | Iterable |
由键值对对象(MapEntry)组成的可迭代对象 |
keys | Iterable |
由所有键(key)数据组成的可迭代对象 |
values | Iterable |
由所有值(value)数据组成的可迭代对象 |
isEmpty | bool | 集合是否为空,不能进行null检测 |
isNotEmpty | bool | 集合是否非空,不能进行null检测 |
hashcode | int | 哈希码 |
runtimeType | Type | 当前对象的运行类型 |
API方法 | 返回值类型 | 说明 |
---|---|---|
clear() | void | 清空Map中的所有键值对数据 |
containsKey(E obj) | bool | Map中的键部分是否包含obj |
containsValue(E obj) | bool | Map中的值部分是否包含obj |
remove(E obj) | E | 移除key=obj的键值对并返回value部分 |
7. Runes类型
Unicode为世界上所有的书写系统中使用的每个字母,数字和符号定义了唯一的数值。
Dart字符串是UTF-16代码单元的序列,所以在字符串中表达32位Unicode值需要特殊的语法。
Unicode代码点的常用方法是\uXXXX,其中XXXX是一个4位十六进制值。
要指定多于或少于4个十六进制数字,请将该值放在大括号中。
Runes r = new Runes("ABC");
print(r);
运行结果
8. Symbole类型
不常用,翻译官网介绍
Symbol对象表示在Dart程序中声明的运算符或标识符。您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号。