Dart tour: 4、数据类型
在 Dart
中有以下常用的内置类型:
- Numbers (
int
,double
) - Strings (
String
) - Booleans (
bool
) - Lists (
List
) - Sets (
Set
) - Maps (
Map
) - Runes (常用于在 Characters API 中进行字符替换)
- Symbols (
Symbol
) - The value null (
Null
)
此外还有些不常用的数据类型,但是也比较重要的:
Object
: 在Dart
中除了Null
之外的其他类型的父类。Future
、Stream
: 在异步中经常使用的类型。Iterable
: 迭代生成器,一般在循环中使用。Never
: 表示表达式永远不会成功运行结束,通常用于必定抛出异常的函数中。dynamic
: 表示这个变量不使用静态检查,可以使用任意类型,一般可以用Object
代替。void
: 表示这个值不存在,通常用于返回值。
#
获取对象的类型在运行时,通过对象的 runtimeType
属性获取到对象的类型。
#
NumbersDart
支持两种 Number
类型,都是 num
的子类:
int
: 整数值;长度不超过 64 位,具体取值范围 依赖于不同的平台。double
: 64 位的双精度浮点数字,且符合IEEE 754
标准。
此外,字符串和数字之间转换也可以相互转换。
#
Strings字符串(String
对象)包含了 UTF-16
编码的字符序列。可以使用单引号或者双引号来创建字符串。
在字符串中,请以 ${表达式}
的形式使用表达式,如果表达式是一个标识符,可以省略掉 {}
。如果表达式的结果为一个对象,则 Dart
会调用该对象的 toString
方法来获取一个字符串。可以使用 +
运算符或并列放置多个字符串来连接字符串。
使用三个单引号或者三个双引号也能创建多行字符串,在字符串前加上 r
作为前缀创建原始字符串(即不会被做任何处理(比如转义)的字符串)。
#
Booleans
Dart
使用bool
关键字表示布尔类型,布尔类型只有两个对象true
和false
,两者都是编译时常量。
Dart
的类型安全不允许使用类似如 if (nonbooleanValue)
或者 assert (nonbooleanValue)
这样的代码检查布尔值。相反应该总是显式地检查布尔值,比如下面的代码这样:
#
ListsList
表示数组对象,在集合中仅可存在指定类型的元素。
可以在 Dart
的集合类型的最后添加尾随逗号,这个尾随逗号并不会影响集合,但它能有效避免「复制粘贴」的错误。
Dart 2.3
中引入了 扩展操作符(...
)和 空感知扩展操作符(...?
),提供了一种将多个元素插入集合的简洁方法。
此外,Dart
还同时引入了集合中的 if
和 集合中的 for
操作,在构建集合时,可以使用条件判断(if
) 和循环 (for
)。
下面示例是 的示例,它可能包含 3 个或 4 个元素:
#
Sets
Map
字面量语法相似于Set
字面量语法。因为先有的Map
字面量语法,所以{}
默认是Map
类型。
Set
是一组特定元素的无序集合。 Set
字面量(literals) 是在 Dart 2.2 中才加入的。
从 Dart 2.3
开始,Set
可以像 List
一样支持使用 扩展操作符
和 空感知扩展操作符
以及 if
和 for
操作。
#
Maps
Map
是用来关联键(keys
)和值(values
)的对象。其中键和值都可以是任何类型的对象。
Map
也可以像List
一样支持使用扩展操作符(...
和...?
)以及集合的if
和for
操作。
创建 Map
对象的方式:
操作 Map
对象的方法(每段代码独立存在):
#
Runes 与 grapheme clusters在 Dart
中,runes
封装了字符串的 Unicode
码位。使用 characters
包来访问或者操作字符(characters,也被称为 Unicode (extended) grapheme clusters)。
Unicode
编码为每一个字母、数字和符号都定义了一个唯一的数值。因为 Dart
中的字符串是一个 UTF-16 的字符序列,所以如果想要表示 32 位的 Unicode
数值则需要一种特殊的语法。
表示 Unicode
字符的常见方式是使用 \uXXXX
,其中 XXXX
是一个四位数的 16 进制数字。例如心形字符(♥)
的 Unicode
为 \u2665
。对于不是四位数的 16 进制数字,需要使用大括号将其括起来。例如大笑的 emoji
表情(😆)
的 Unicode
为 \u{1f600}
。
如果需要读写单个 Unicode 字符,可以使用 characters 包中定义的 characters getter
。它将返回 Characters
对象作为一系列 grapheme clusters
的字符串。下面是使用 characters
API 的样例:
String
类与 runes
可以通过某些方法相互转换。
#
Symbols
Symbol
表示Dart
中声明的操作符或者标识符。通常基本用不到。
Symbol
对于那些通过名称引用标识符的 API 很有用,因为代码压缩后,尽管标识符的名称会改变,但是它们的Symbol
会保持不变。
可以使用在标识符前加 # 前缀来获取
Symbol
,Symbol
字面量是编译时常量。