Dart数据类型

Dart 语言对以下类型有特殊支持:

  • 数字(int,double)
  • 字符串(String)
  • 布尔(bool)
  • 记录((value1,value2))
  • 函数(Function)
  • 列表(List,也叫数组)
  • 集合(Set)
  • 映射(Map)
  • Runes (Runes;常被 characters API 替换)
  • 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,是一个特殊的浮点数值,表示“不是一个数字”的状态,通常在数学运算中出现无效或未定义的结果时产生

isNaNdouble 类型的一个属性,返回一个布尔值:

  • 如果该值是 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'

标签