myfreax

Dart的内置类型

在Dart中所有变量的引用都是对象,即一个类的实例,你也可以使用构造函数初始化变量,很多内置类型都有自己的构造函数,比如可以使用 Map() 构造函数创建一个映射。,我们将说明Dart内置类型作用以及使用方法

7 min read
By myfreax
Dart的内置类型

你可以初始化一个对象使用指定类型的字面量,比如 'this is a string' 是一个字符串, true 是布尔值。

这是因为在Dart中所有变量的引用都是对象,即一个类的实例,你也可以使用构造函数初始化变量,很多内置类型都有自己的构造函数,比如可以使用 Map() 构造函数创建一个映射。

在本文中,我们将说明Dart内置类型作用以及使用方法。

Numbers

Dart中numbers类型有两种变体, intdouble

int

整形值最大不超过64位,这依赖与平台而确定,在Dart VM,指可以是从-263 到 263 。Dart也可以编译为javascript,允许的值是从 -253 到 253 - 1

double

64位浮点数,符合IEEE 754 标准规范

int和了double都是num的子类,num类型都有基本的操作符,你可以使用这些操作符进行运算,详细请参考dart:math数学库

var x = 1;
var hex = 0xDEADBEEF;

在Dart 2.1,整形变量会自动转换为浮点数,当在需要的时候

double z = 1; // 相当于 double z = 1.0.

转换字符串为数值

// 字符串 -> 整型
var one = int.parse('1');
assert(one == 1);

// 字符串 -> 浮点数
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);

// 整形 -> 字符串
String oneAsString = 1.toString();
assert(oneAsString == '1');

// 浮点数 -> 字符串
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');

数值位运算

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111

String

Dart字符串是UTF-16编码单元序列,可以使用单引号或者双引号创建字符串

var s1 = '单引号.';
var s2 = "双引号.";
var s3 = 'It\'转义字符串分界符.';
var s4 = "It'可以包含其它分界符.";

你也可以通过使用 ${expression} 将一个表达式插入字符串中,如果表达式是一个标识符则不需要{},来获得一个对象的字符串,Dart会自动调用对象的 toString() 方法

var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
    'Dart has string interpolation, ' +
        'which is very handy.');
assert('That deserves all caps. ' +
        '${s.toUpperCase()} is very handy!' ==
    'That deserves all caps. ' +
        'STRING INTERPOLATION is very handy!');

使用+连接字符串

var s1 = 'String '
    'concatenation'
    " works even over line breaks.";
assert(s1 ==
    'String concatenation works even over '
        'line breaks.');

var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');

使用三个单引号或者三个双引号创建多行字符串

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

通过前缀r创建一个Runes字符串

var s = r'In a raw string, not even \n gets special treatment.';

布尔值

布尔值是Dart内置的类型,有两个对象

布尔值是Dart内置的类型,仅有两个对象truefalse,都是编译时常量,Dart是类型安全语言,这意味你不能像if (非布尔值)来进行判断

// 检查空字符串
var fullName = '';
assert(fullName.isEmpty);

// 是否等于0.
var hitPoints = 0;
assert(hitPoints <= 0);

// 是否为null.
var unicorn;
assert(unicorn == null);

// 是否是NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

Lists

在很多编程语言中都有数组的存在。但在Dart中数组是列表对象,很多人都称为列表,Dart列表很像javascript的数组

var list = [1, 2, 3];

上面示例中Dart尝试将list变量的类型推断为List<int> ,如果你尝试添加一个非整型的元素,Dart会抛出一个运行时的错误

列表从0开始索引,列表第一个索引是0,最后一个索引是 list.length - 1 ,你可以像javascript一样获取列表的元素或者长度

var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

list[1] = 1;
assert(list[1] == 1);

在Dart 2.3引入了扩展运算符(...)和空值感知扩展运算符(......?),它提供了一种将多个元素插入列表的简洁方法。

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

如果...扩展符右则变量为空时,可以使用?判定是否为空,当为空则不会插入

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

Dart 2.3 引入 collection ifcollection for, 可以直接在列表中使用 (if) 和  (for).判断后加入元素

// if
var nav = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];

// for
var listOfInts = [1, 2, 3];
var listOfStrings = [
  '#0',
  for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');

Sets

Dart中集合是无序唯一元素的组合,可以通过集合的字面量和Set的构造函数初始化。

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

上面的示例中Dart会推断变量 halogens 是类型 Set<String> 请不要尝试添加,非字符串元素

创建空的集合

var names = <String>{};
// Set<String> names = {}; // 同上.
// var names = {}; // 创建映射不是集合.

Map 字面量语法与Set的字面量语法很相似,因为Map是最先出现的,因此 {}Map 的类型,如果你忘记在 {} 添加类型声明,Dart会创建类型是 Map<dynamic, dynamic> 的映射

添加元素到集合,获取集合的长度

// 添加
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);

//获取长度
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);

在Dart 2.3,集合也支持扩展运算符 (... and ...?), 就像列表一样

Map

映射是一个键值对的对象,键值都可以是任意类型的对象,每个键在映射只会出现一次,可以绑定相同的值到不同键名上。Dart可以通过map字面量和Map的构造函数初始化映射

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

Dart 推断  gifts 变量的类型是 Map<String, String> 请不要尝试添加其它类型

通过构造函数创建Map

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

在Dart2构造函数需要添加new关键词,之后就是可选的

添加键值对到Map

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair

获取Map指定键的值

var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');

如果指定键名在Map找不到值则返回null

var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);

获取Map的长度

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

在Dart 2.3,Map也支持扩展运算符 (... and ...?), 就像列表一样

Runes

在Dart中,runes是 UTF-32编码字符串

Unicode为世界上所有书写系统中使用的每个字母,数字和符号定义唯一的数值。由于Dart字符串是UTF-16代码单元的序列,因此在字符串中表示32位Unicode值需要特殊语法。

Symbols

一个Symbol对象表示一个操作符或者标识符,您可能永远不需要使用Symbol,但它们对于按名称引用标识符的API非常有用,因为缩写会更改标识符名称而不会更改标识符符号

获取标识符的符号

#radix
#bar

Related Articles