Dart数据类型
Dart 语言对以下类型有特殊支持:
- 数字(int,double)
- 字符串(String)
- 布尔(bool)
- 记录((value1,value2))
- 函数(Function)
- 列表(List,也叫数组)
- 集合(Set)
- 映射(Map)
- Runes (
Runes;常被charactersAPI 替换) - symbol(symbol)
- 值null (Null)
因为 Dart 中的每个变量都指向一个对象–>一个类的实例–>你通常可以使用构造函数来初始化变量。一些内置类型有自己的构造函数。例如,你可以使用 Map() 构造函数创建一个映射
还有一些其他类型在 Dart 语言中也扮演着特殊角色:
Object:除Null外所有 Dart 类的超类Enum:所有枚举的超类Future和Stream:用于异步编程Iterable:用于for-in 循环和同步生成器函数Never:表示表达式永远无法成功完成求值。最常用于总是抛出异常的函数dynamic:表示你希望禁用静态检查。通常你应该改用Object或Object?void:表示一个值永远不会被使用。常用于作为返回类型
数字
Dart 数字有两种类型:
- int:不大于 64 位的整数值,在原生平台,值的范围是 -263 到 263 – 1。在 Web 上,整数值表示为 JavaScript 数字(没有小数部分的 64 位浮点值),范围是 -253 到 253 – 1
- double:64位(双精度)浮点数
int 和 double 都是 num 的子类型。num 类型包含基本运算符,例如 +、-、/ 和 *,以及 abs()、ceil() 和 floor() 等方法。(位运算符,如 >>,定义在 int 类中。)如果 num 及其子类型没有你想要的功能,dart:math 库可能会有
下面是声明整数类型的变量:
var a = 100; 或 int a = 100;
下面是声明double类型的变量,如下:
double a = 1.1; //小数
下面是声明num类型,此时变量可以是int也可以是double,如下:
num i = 10;
i = i + 1.5; //i=11.5
整数变量会自动转换为double,如下:
doublt i = 10;
print(i); //10.0
将字符串转换为整数,如下:
String s = '100';
int i = int.parse(s); //i=100
将字符串转换为浮点数,如下:
String s = '100';
double d = double.parse(s);//d=100.0
将整数转换为字符串,如下:
int i = 100;
String s = i.toString();// s = '100'
将double转换为字符串,如下:
double d = 10.586;
String s = d.toStringAsFixed(2); //s=10.59 保留2位小数并四舍五入
可以使用一个或多个下划线 (_) 作为数字分隔符,使长数字字面量更易读,如下:
var i = 123_345_456_678 //Dart版本要达到3.6
字符串
1、可以使用单引号或双引号创建字符串,如下:
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.";//不用转义
2、可以使用 ${expression} 将表达式的值放入字符串中,如下:
int a = 100;
int b = 200;
String c = "${a + b}"; //字符串插值,接收变量只能是字符串
3、如果表达式是一个标识符,你可以省略 {},如图:
int a = 100;
String c = "$a"; //省略{}
4、使用“==”来判断两个字符串是否相等,相等返回true,如图:
String a = 'hello';
String b = 'hello';
print(a ==b ); //true
5、使用相邻的字符串字面量或者”+“来连接字符串,如下:
String a = 'hello';
String b = 'world';
String c = "$a" + "$b"; //或者"$a$b"也可以连接字符串
6、要创建多行字符串,请使用单引号或双引号的三重引号,比如:‘’‘ ‘’‘ 和“”“ ”“”,如下:
String a = """hello
world
beijing
shenzhen""";
或者
String a = '''hello
world
beijing
shenzhen''';
7、可以在字符串前面加“r” 来获取原始字符串,如下:
String a = r'hello \n world'; //a=hello \n world,保留了\n
布尔
Dart 有一个名为 bool 的类型。只有两个对象属于 bool 类型:布尔字面量 true 和 false,它们都是编译时常量
Dart 的类型安全意味着你不能使用诸如 if (非布尔值) 或 assert (非布尔值) 这样的代码。而是要显式地检查值,如下:
1、判断字符串是否为空,如图:


assert是一个在开发测试阶段用来调试代码的断言函数,可用来判断布尔值,要想让asser生效,需要dart run –enable-asserts命令才行
2、下面检查是否为0,如下:
var hitPoints = 0;
assert(hitPoints == 0);
3、下面检查是否为null,如下:
var unicorn = null;
assert(unicorn == null);
4、检查一个值不是一个数字,如下:
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
isNaN 是一个布尔属性,用于检查一个数值是否是“非数字”,Nan全称是Not a number,是一个特殊的浮点数值,表示“不是一个数字”的状态,通常在数学运算中出现无效或未定义的结果时产生
isNaN 是 double 类型的一个属性,返回一个布尔值:
- 如果该值是 NaN,则返回
true - 如果该值是一个有效的数字,则返回
false
下面例子判断两个变量是不是数字,如图:


double.nan 是一个特殊的常量,表示“非数字”(NaN,即 Not-a-Number)。它是一个 double 类型的值,用于表示无效或未定义的浮点数运算结果
NaN 是唯一一个不等于自身的值。因此,NaN == NaN 的结果是 false,因此如果要检查一个值是否为NaN,要使用isNaN,而不是==
Symbol
Symbol 的使用频率相对较低,通常出现在一些高级或特定场景中,Symbol 是 Dart 中的一种编译时常量类型,用于表示程序中的标识符名称(如变量名、方法名、类名等)。它通过 # 符号创建:
Symbol s = #someVariable; // 表示标识符 'someVariable'
- 反射:通过
Symbol,可以在运行时动态地访问对象的属性或方法,Flutter中被禁用 - 元编程:在运行时动态生成或修改代码
- 避免硬编码字符串:需要动态访问属性或方法时,用
Symbol可以避免硬编码字符串,减少错误
Symbol使用频率非常低,这里不再说了
记录
记录是一种匿名、不可变、聚合类型。像其他 集合类型 一样,它们允许你将多个对象打包成一个对象。与其他集合类型不同,记录是固定大小、异构且类型化的
什么是异构:异构(Heterogeneous)指的是一个数据结构或集合中可以包含不同类型的数据元素。与之相对的是同构(Homogeneous),即所有元素类型相同
记录是实际的值;你可以将它们存储在变量中,嵌套它们,在函数之间传递它们,以及将它们存储在列表、映射和集合等数据结构中
记录表达式 是用逗号分隔的命名或位置字段列表,用括号括起来,语法如下:
#record只是i一个变量名,记录名字可以自定义,不一定是record
var record = ('first', a: 2, b: true, 'last',100);//异构
记录类型注解 是用逗号分隔并用括号括起来的类型列表。明确指定记录的结构和字段类型(可包含位置字段或命名字段)
1、声明位置字段的记录,并赋值,如图:

注意:位置字段在给记录赋值的位置必须与声明时的一致,比如声明的时候是(int,String),那么赋值不能是(String,int)
2、声明命名字段,赋值的时候不受顺序的影响,因为根据字段名赋值,如图:


注意:上面给record赋值的时候根据字段名来赋值,就不用按照顺序来了
3、可以使用记录类型注解来定义返回类型和参数类型,如图:


4、记录字段可通过内置的getter来访问,因为记录不可修改,因为没有setter,如图:


如果a:10在前面,取后面字段也是从$1开始,如图:


5、如果两个记录具有相同的字段集,并且其相应字段具有相同的值,则它们相等,如下:
(int x, int y, int z) point = (1, 2, 3);
(int r, int g, int b) color = (1, 2, 3);
print(point == color); // Prints 'true'


