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 属性获取到对象的类型。
Numbers#
Dart 支持两种 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) 这样的代码检查布尔值。相反应该总是显式地检查布尔值,比如下面的代码这样:
Lists#
List 表示数组对象,在集合中仅可存在指定类型的元素。
可以在 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字面量是编译时常量。