Dart 基本数据类型
Smoothness 2022/9/21 Dart基础
本文介绍Dart
的基本数据类型。
# 变量
- 弱类型
var
如果没有初始值,可以变成任何类型,但是如果有初始值将被锁定类型。var声明后默认是
null
,一般在不明确类型的时候使用。var a; a = '123'; a = 123; a = { name: '张三' };
1
2
3
4
5
6Object
动态任意类型,编译阶段检查类型Object a = 123; a = '123'; a.x();
1
2
3dynamic
动态任意类型,编译阶段不检查类型dynamic a = 123; a = '123'; a.x();
1
2
3
- 强类型
- 声明类型,
声明之后类型将被锁定
- num 数字
- int 整型
- double 浮点
- bool 布尔
- String 字符串
- StringBuffer 字符串 buffer
- DateTime 时间日期
- Duration 时间区间
- List 列表
- Sets 无重复队列
- Maps kv 容器
- enum 枚举
- 声明类型,
# 常量
类型声明可以省略,并且初始化后不能在赋值。
final
适用于初始化成员变量final a = 123; final b = [1, 2, 3];
1
2const
适用于定义全局变量const a = 123; const b = [1, 2, 3];
1
2final
和const
区别final不会在内存中重复创建,const声明相同的变量会在内存中重复使用
// identical比较两个引用的是否是同一个对象判断是否相等 final a = [1, 2, 3]; final b = [1, 2, 3]; print(identical(a, b)); // false const a = [1, 2, 3]; const b = [1, 2, 3]; print(identical(a, b)); // true
1
2
3
4
5
6
7
8
# 数值
int
- 比较两个引用的是否是同一个对象判断是否相等
double
- 64-bit (双精度) 浮点数,符合 IEEE 754 标准。
num
- int 和 double 都是 num 的子类。
十六进制
int b = 0xE; print(b); [14]
1
2
3
4数值转换
// string -> int int a = int.parse('123'); // string -> double double b = double.parse('1.223'); // int -> string String a = 123.toString(); // double -> string String b = 1.223.toString(); // double -> int double a = 1.8; int b = a.toInt();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 布尔
- 声明
bool a; print(a);
1
2 - 判断
只有true才会判断为真,其他所有的都是false
bool a = true; print(a); String b = ''; if (b.isEmpty) { print('b是空的'); } String c = '123'; if (c.isNotEmpty) { print('c不是空的'); } final d = [1]; print(d.isEmpty); // 打印结果 // true b是空的 c不是空的 false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 字符串
声明
String a = 'a'; String b = "b";
1
2字符串模板
var a = 'abc'; String b = 'ducafecat : ${a}'; print(b);
1
2
3字符串链接
var a = 'hello' ' ' 'ducafecat'; var a = ''' hello word dart '''; print(a);
1
2
3
4
5
6
7
8
9取消转义
var a = r'hello word \n dart'; print(a);
1
2字符串创建
var sbuffer = StringBuffer(); sbuffer..write('hello word!') ..writeAll(['', 'dart']); print(sbuffer); print(sbuffer.toString());
1
2
3
4
5
# 日期、时间
声明
获取当前时间
var now = DateTime.now(); print(now);
1
2获取指定时间
var d = DateTime(1996, 1, 1); print(d);
1
2
时间增减量
var d = DateTime(1996, 1, 1); print(d.add(Duration(days: 1))); print(d.add(Duration(days: -1)));
1
2
3
4时间比较
var d1 = DateTime(2022, 11, 3); var d2 = DateTime(2022, 11, 2); // d1是否在d2之后 print(d1.isAfter(d2)); // d1是否在d2之前 print(d1.isBefore(d2));
1
2
3
4
5
6时间差
var d1 = DateTime(2022, 1, 1); var d2 = DateTime(2022, 1, 2); var difference = d1.difference(d2); print([difference.inDays, difference.inHours, difference.inMicroseconds]);
1
2
3
4时间戳
var now = DateTime.now(); print(now.millisecondsSinceEpoch); print(now.microsecondsSinceEpoch);
1
2
3
# 列表
声明
自动
var a = [1, 2, 3]; print(a); List<String> b = []; b ..add('123') ..add('234'); print(b);
1
2
3
4
5
6
7
8指定长度
var c = List<num>.filled(3, 0); c[2] = 2; print(c);
1
2
3迭代器生成数据
var d = List<String>.generate(10, (index) => ('张三$index')); print(d);
1
2
方法
添加
var a = [1, 2, 3]; a ..add(1) ..addAll([1, 2, 3]);
1
2
3
4插入
var a = [1, 2, 3]; a ..insert(0, 100) ..insertAll(1, [200, 200]);
1
2
3
4查询
var a = [1, 2, 3]; print(a.indexOf(2)); print(a.indexOf(5));
1
2
3按条件查询
var a = [1, 2, 3]; print(a.indexWhere((item) => item == 2));
1
2删除
var a = [1, 2, 3, 4, 5]; print(a); // [1, 2, 3, 4, 5] a.remove(1); print(a); // [2, 3, 4, 5] a.removeAt(1); print(a); // [2, 4, 5] a.removeRange(0, 1); print(a); // [4, 5] a.removeWhere((element) => element == 5); print(a); // [4]
1
2
3
4
5
6
7
8
9
10
11
12
13
14洗牌
var a = [1, 2, 3, 4, 5]; print(a); // [1, 2, 3, 4, 5] a.shuffle(); print(a); // [5, 3, 2, 1, 4]
1
2
3
4填充
var a = [1, 2, 3, 4, 5]; a.fillRange(0, 2, 100); print(a); // [100, 100, 3, 4, 5]
1
2
3排序
var a = [1, 2, 3, 4, 5, 2]; a.sort(); print(a); // [1, 2, 2, 3, 4, 5]
1
2
3合并
必须是相同类型数据合并。
var a = [1, 2, 3, 4, 5, 2]; var b = [123]; print(a + b); // [1, 2, 3, 4, 5, 2, 123]
1
2
3复制
var a = [1, 2, 3, 4, 5, 2]; var b = a.sublist(0, 3); print([a, b]);
1
2
3
# Map
声明
任意
var a = {'name': '张三', 'age': 12};
1强类型
var b = <String, int>{};
1
方法
新增单个属性
var b = <String, int>{}; b['第一天'] = 123; b['第二天'] = 456; b.addAll({'第三天': 789});
1
2
3
4新增整个Map
var b = <String, int>{}; var c = {'第四天': 110}; b.addEntries(c.entries);
1
2
3检查是否存在Key
var b = <String, int>{}; print(b.containsKey('第四天'));
1
2检查是否存在Value
var b = <String, int>{}; print(b.containsValue(110));
1
2更新
var b = <String, int>{}; b.update('第一天', (value) => value + 120);
1
2删除
var b = <String, int>{}; b.remove('第四天');
1
2清空
var b = <String, int>{}; b.clear();
1
2
# Set
声明
任意
var a = Set(); var a = <dynamic>{};
1
2强类型
var b = Set<num>(); var b = <num>{};
1
2
输出列表
var l = [1, 2, 3, 4, 1, 2, 3, 4]; var s = <num>{}; s.addAll(l); // {1, 2, 3, 4} s.toList(); // [1, 2, 3, 4]
1
2
3
4方法
- 添加
a.add('value'); b.addAll([1, 2, 3]);
1
2- 查询
print(b.contains(2));
1- 交集
var b = <num>{1, 2, 3}; var c = <num>{1, 3, 5}; print(b.intersection(c)); // {1, 3}
1
2
3- 联合
var c = <num>{1, 2, 3}; var d = <num>{11, 32, 53}; var e = <num>{100}; print(c..union(d)..union(e)); // {1, 2, 3, 11, 32, 53, 100}
1
2
3
4- 删除
var d = <num>{11, 32, 53}; d.remove(11);
1
2- 清空
var d = <num>{11, 32, 53}; d.clear();
1
2
# 枚举
使用场景
一般在常量定义中使用,类型比较方便
enum ColorType { none, java, js, python, dart, } void main(List<String> args) { // 1 接收输入值 red 字符串 var color = ColorType.java; // 3 switch 判断,打印输出 switch (color) { case ColorType.java: print('java'); break; case ColorType.js: print('js'); break; case ColorType.python: print('python'); break; default: print('其他'); } }
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