Dart 基本概念之数据类型
发表于 2019-07-05 12:23
|
分类于 Dart
|
评论次数 0
|
阅读次数 80

Dart 内置支持的类型有 7 种:NumbersStringsBooleansLists(也称作 Arrays)、MapsRunes(用于在字符串中表示 Unicode 字符)、Symbols

和其他编程语言一样,我们可以直接使用字面量来初始化这些类型,例如 'this is a string' 代表一个字符串字面量,true 代表布尔值字面量。

Numbers(数值)

Dart 支持两种类型的数值:

void main() { num age = 1; int width = 2; double height = 3.14; print(age is num);// output: true print(age is int);// output: true print(age is double);// output: false print(width is num);// output: true print(width is int);// output: true print(width is double);// output: false print(height is num);// output: true print(height is int);// output: false print(height is double);// output: false }

Strings(字符串)

Dart 字符串是 UTF-16 编码的字符序列,可以使用单引号、双引号和三引号来创建字符串。

使用单引号来表示字符串时,字符串中的单引号需要使用 / 进行转译,除此之外,和使用双引号没有任何区别,而三引号相当于 JavaScript 中的反引号,可以表示多行字符串,用法如下:

void main() { var css = ''' body { margin: 0; padding: 0; } '''; print(css); } /* output: body { margin: 0; padding: 0; } */

如果需要在字符串中解析变量或表达式,用法为 ${expression},这也和 JavaScript 的反引号用法一模一样,不过不同的是,Dart 中单引号和双引号都能解析变量或表达式,并且如果只解析变量,则可以省略花括号,使用 $expression 即可,用法如下:

void main() { var foo = 666; var bar = 777; var str = '$foo is a number'; var total = "total is ${foo + bar}"; print(str);// output: 666 is a number print(total);// output: total is 1443 }

可以使用 + 操作符来把多个字符串连接为一个,也可以把多个字符串放到一起来实现同样的功能,在字符串前加上r标识符,将输出原样字符,不会解析字符串中的转译符 /,用法如下:

void main() { var foo = 'String ' 'concatenation' " works even over line breaks."; print(foo);// output: String concatenation works even over line breaks. var bar = 'The + operator ' + 'works, as well.'; print(bar);// output: The + operator works, as well. var str = r"In a raw string, even \n isn't special."; print(str);// output: In a raw string, even \n isn't special. }

Runes

在 Dart 中,runes 代表字符串的 UTF-32 code points,它继承自 Iterable,所以它是一个由 int 元素组成的可遍历的集合,使用格式为 'str'.runes,例如:

void main() { var str = 'str'.runes; print(str);// output: (115, 116, 114) }

Dart 和 Java 一样,每个字符都是 UTF-16 编码,字符串就是 UTF-16 code units 字符序列,UTF-16 编码的最大值是 2 的 16 次方,也就是 65536。如果一个字符的 code point 大于 65536,就需要用组合来表示它的 code point,比如 ? 对应的 code point 是 [55357, 56832],在 Dart 中可以使用 str.codeUnits 来获取一个字符的 code point,用法如下:

main() { var face = '?'; print(face.codeUnits);// output: [55357, 56832] print(face.runes);// output: (128512) }

这种 unicode 字符也可以使用 \uXXXX 的格式来表示,作用是一模一样的,这里的 XXXX 是 4 个 16 进制的数,例如 对应的 code 是 \u2665。对于非 4 个数值的情况, 把编码值放到大括号中即可,例如 ? 对应的 code 是 \u{1F600}

main() { var face = '?'; var faceCode = '\u{1F600}'; var heart = '♥'; var heartCode = '\u2665'; print(face == faceCode);// output: true print(heart == heartCode);// output: true }

Booleans(布尔值)

Booleans 类型是所有编程语言中使用的最多的一种类型,和其他语言一样,Dart 中的布尔值有两个字面量:truefalse

在 Dart 中可以使用关键字 bool 来初始化一个布尔值类型的变量,和 JavaScript 以及 PHP 这种弱类型语言不同,在 Dart 中只有 true 才会被认为是 true,其他值都是 false,并且 if 语句中的条件必须是 bool 类型的值或者变量,否则将会在调试环境下报错:

main() { var isTrue = 1; if (!isTrue) { print('is true'); } } /* output: Error: A value of type 'int' can't be assigned to a variable of type 'bool'. Try changing the type of the left hand side, or casting the right hand side to 'bool'. if (!isTrue) { ^ */

! 取反操作符也只能用于 truefalse,否则也将报错:

main() { var isTrue = 1; print(!isTrue); } /* output: Error: A value of type 'int' can't be assigned to a variable of type 'bool'. Try changing the type of the left hand side, or casting the right hand side to 'bool'. print(!isTrue); ^ */

Lists(列表、数组)

Dart 中的 Lists 在其他语言中一般称作 Array(数组),Lists 的字面量和 JavaScript、PHP 一样使用 [] 来声明,并且可以用 arr.length 来获取数组的长度:

main() { var arr = [555, 666, 888]; print(arr.length);// output: 3 }

也可以使用泛类型的方式来声明一个 Lists 类型的变量,泛类型的详细使用可以查看 泛类型文档

main() { List<String> fruits = ['banana', 'cucumber']; fruits.add( 'eggplant'); print(fruits[2]);// output: eggplant }

操作 Lists 类型的 api 也有非常多,我就不再赘述,详细使用可以参考 List class 文档

Maps

Dart 中的 Maps 和 PHP 中的关联数组、JavaScript 中的 Object 很相似,即 key-value 形式的集合。键和值可以是任何类型的对象,每个只出现一次, 而一个则可以出现多次。Dart 通过 map 字面量 和 Map 类型支持 map。

main() { var fruits = {1: 'banana', 2: 'cucumber', 'three': 'eggplant'}; print(fruits['three']);// output: eggplant }

和 JavaScript 一样,可以使用 Map 构造函数初始化一个变量:

main() { var fruits = new Map(); fruits[1] = 'banana'; fruits[2] = 'cucumber'; fruits[3] = 'eggplant'; print(fruits);// output: {1: banana, 2: cucumber, 3: eggplant} }

和 Lists 一样,也可以使用泛类型来声明 Map 变量:

main() { Map<int, String> fruits = { 1: 'banana', 2: 'cucumber', 3: 'eggplant' }; print(fruits[3]);// output: eggplant }

Symbols

一个 Symbol object 代表 Dart 程序中声明的操作符或者标识符,可以使用 # 符号作为标识符的前缀,即可使用字面量的方式获取 symbol 对象,也可以使用 Symbol 关键字来声明 symbol 对象,用法如下:

main() { var className = #Person; print(className);// output: Symbol("Person") Symbol className2 = #Person2; print(className2);// output: Symbol("Person2") }

Dart 的 symbols 和 JavaScript 中的 symbol 一样,需要用的地方很少,关于更多详情可以参考 dart:mirrors - reflection

发布评论
还没有评论,快来抢沙发吧!