1.变量
可以通过显式声明指定类型的方式,创建一个变量并进行初始化。1
String name = 'Bob';
dart中变量支持类型推导,用var创建一个变量并进行初始化:1
var name = 'Bob';
name 变量的类型被推断为 String。 var的错误用法:1
2var name = 'Bob';
name = 18; // error 不可以将int赋值给一个String类型
如果对象不限定为单个类型,可以指定为 对象类型
或 动态类型
。1
2
3
4dynamic name = 'Bob';
print(name.runtimeType); // String
name = 18;
print(name.runtimeType); // int
提示: 本页局部变量遵守
风格建议指南
使用 var。 没有使用指定类型的方式。
默认值
未初始化的变量默认值是 null
。即使变量是数字 类型默认值也是 null,因为在 Dart 中一切都是对象,数字类型 也不例外。
Final 和 Const
使用过程中从来不会被修改的变量, 可以使用 final 或 const, 而不是 var 或者其他类型, Final 变量的值只能被设置一次; const 变量在编译时就已经固定或类变量在第一次使用时被初始化。1
2
3
4
5
6
7
8final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
name = 'Alice'; // error: 一个 final 变量只能被设置一次。
const bar = 1000000; // 压力单位 (dynes/cm2)
const double atm = 1.01325 * bar; // 标准气压
const baz = [];
baz[0] = 1; // error: Cannot modify an unmodifiable list
- const在赋值时,赋值的内容必须是在编译期间就确定下来的。
const是不可以赋值为DateTime.now()
- final在赋值时,可以动态获取,比如赋值一个函数。
final一旦被赋值后就有确定的结果,不会再次赋值.
2.内建类型
Dart 语言支持以下内建类型:
Number
String
Boolean
List (也被称为 Array)
Map
Set
Rune (用于在字符串中表示 Unicode 字符)
Symbol
Number
int
整数值不大于64位, 具体取决于平台。 在 Dart VM 上, 值的范围从 -2^63 到 2^63 - 1. Dart 被编译为 JavaScript 时,使用 JavaScript numbers, 值的范围从 -2^53 到 2^53 - 1.
double
64位(双精度)浮点数,依据 IEEE 754 标准。1
2var x = 1;
var hex = 0xDEADBEEF; // 支持16进制格式String
Dart 字符串是一组 UTF-16 单元序列。 字符串通过单引号或者双引号创建。
提示: == 运算符用来测试两个对象是否相等。可以使用 + 运算符来把多个字符串连接为一个。
类似 python
中使用连续三个单引号或者三个双引号实现多行字符串对象的创建,使用 r
前缀,可以创建 “原始 raw” 字符串:1
2
3
4
5
6
7
8
9var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
var s = r"In a raw string, even \n isn't special.";
Boolean
Dart 使用 bool
类型表示布尔值。 Dart 只有字面量 true
and false
是布尔类型, 这两个对象都是编译时常量。
Dart 的类型安全意味着不能使用 if (nonbooleanValue) 或者 assert (nonbooleanValue)。 而是应该像下面这样,明确的进行值检查:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 检查空字符串。
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);
List
Dart 中的 List 字面量非常像 JavaScript 中的 array 字面量。 下面是一个 Dart List 的示例:1
var list = [1, 2, 3];
提示:Dart 推断 list 的类型为 List
。 如果尝试将非整数对象添加到此 List 中, 则分析器或运行时会引发错误。
在 List 字面量之前添加 const 关键字,可以定义 List 类型的编译时常量:1
2var constantList = const [1, 2, 3];
// constantList[1] = 1; // 取消注释会引起错误。Set
下面是通过字面量创建 Set 的一个简单示例:1
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
要创建一个空集,使用前面带有类型参数的 {} ,或者将 {} 赋值给 Set 类型的变量:1
2
3var names = <String>{};
// Set<String> names = {}; // 这样也是可以的。
// var names = {}; // 这样会创建一个 Map ,而不是 Set 。
Map
通常来说, Map 是用来关联 keys 和 values 的对象。 keys 和 values 可以是任何类型的对象。在一个 Map 对象中一个 key 只能出现一次。 但是 value 可以出现多次。Map 对象也可以使用 Map 构造函数创建:1
2
3
4
5
6
7
8
9
10
11var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
提示: 这里为什么只有 Map() ,而不是使用 new Map()。 因为在 Dart 2 中,new 关键字是可选的。
类似 JavaScript ,添加 key-value 对到已有的 Map 中:1
2var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
类似 JavaScript ,从一个 Map 中获取一个 value:1
2var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
集合的常见操作:
1 | // 获取集合的长度 |
Map的常见操作
1 | // Map的操作 |
实现了 Iterable 的类(比如, List 和 Set)同样也支持使用 for-in 进行迭代操作 iteration :1
2
3
4var collection = [0, 1, 2];
for (var x in collection) {
print(x); // 0 1 2
}