Flutter(Dart)基础——数据类型

Flutter(Dart)基础——数据类型


Dart 数据类型

Dart 中所有的对象都是对应一个类的实例。无论是int、函数和 null 等都是对象。

Dart 中所有对象继承自 Object 类。

类型推断

Dart 是代码类型安全的语言,但是由于其支持类型推断,因此大多数变量不需要显式地指定类型。

例如:

var name = 'budaye';
var year = 2020;
var antennaDiameter = 3.7;
var flybyObjects = ['木星', '土星', '天王星', '海王星'];
var image = {
  'tags': ['土星'],
  'url': '//path/to/saturn.jpg'
};
dynamic 和 Object

前面我们说过,Dart 里所有东西都是对象,并且所有对象的父类就是 Object。

使用 Object 时,我们只是在说接受任意类型,我们需要的是一个 Object。类型系统会保证其类型安全。

如果要明确说明不需要任何类型,需要使用特殊类型 dynamic,dynamic 会告诉编译器,我们知道自己在做什么,不用做类型检测。

当我们调用一个不存在的方法时,会执行 noSuchMethod() 方法,默认情况下(在 Object 里实现)它会抛出 NoSuchMethodError。为了在运行时检测进行类型检测,Dart 提供了一个关键字 is。

内置类型

Dart 没有 byte、char 和 float,并且int、double都是 64 位。

Dart 语言支持下列的类型:

  • numbers
  • strings
  • booleans
  • lists (也被称为 arrays)
  • sets
  • maps
  • runes (用于在字符串中表示 Unicode 字符)
  • symbols

可以直接使用字面量来初始化上述类型。例如 ‘This is a string’ 是一个字符串字面量,true 是一个布尔字面量。

由于 Dart 中每个变量引用都指向一个对象(一个 类 的实例),你通常也可以使用 构造器 来初始化变量。一些内置的类型有它们自己的构造器。例如你可以使用 Map() 来创建一个 map 对象。

Numbers

Dart 支持两种 Number 类型:

1. int

整数值;长度不超过 64位,具体取值范围依赖于不同的平台。在 DartVM 上其取值位于 -263 至 263 - 1 之间。编译成 JavaScript 的 Dart 使用 JavaScript 数字,其允许的取值范围在 -253 至 253 - 1 之间。

var x = 1;
var hex = 0xDEADBEEF;
  1. double

64位的双精度浮点数字,且符合 IEEE 754 标准。

var y = 1.1;
var exponents = 1.42e5;

int 和 double 都是 num 的子类。 num 中定义了一些基本的运算符比如 +、-、*、/ 等,还定义了 abs()、ceil() 和 floor() 等方法(位运算符,比如 » 定义在 int 中)。如果 num 及其子类不满足你的要求,可以查看 dart:math 库中的 API。

从 Dart 2.1 开始,整型字面量将会在必要的时候自动转换成浮点数字面量:

double z = 1; // Equivalent to double z = 1.0
Strings

Dart 里的 String 跟 Java 中的一样,是不可变对象;但不同的是,检测两个 String 的内容是否一样,我们使用 == 进行比较;如果要测试两个对象是否是同一个对象(indentity test),使用 identical 函数。

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

var s1 = '使用单引号创建字符串字面量。';
var s2 = "双引号也可以用于创建字符串字面量。";
var s3 = '使用单引号创建字符串时可以使用斜杠来转义那些与单引号冲突的字符串:\'。';
var s4 = "而在双引号中则不需要使用转义与单引号冲突的字符串:'";

可以在字符串中以 ${表达式} 的形式使用表达式,如果表达式是一个标识符,可以省略掉 {}。如果表达式的结果为一个对象,则 Dart 会调用该对象的 toString 方法来获取一个字符串。

var s = '字符串插值';
assert('Dart 有$s,使用起来非常方便。' == 'Dart 有字符串插值,使用起来非常方便。');
assert('使用${s.substring(3,5)}表达式也非常方便' == '使用插值表达式也非常方便。');

注:== 运算符判断两个对象的内容是否一样,如果两个字符串包含一样的字符编码序列,则表示相等。

字符串和数字之间的转换
// String -> int
var one = int.parse('1');
assert(one == 1);

// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');

// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
Booleans

Dart 使用 bool 关键字表示布尔类型,布尔类型只有两个对象 true 和 false,两者都是编译时常量。

Dart 的类型安全不允许你使用类似 if (nonbooleanValue) 或者 assert (nonbooleanValue) 这样的代码检查布尔值。相反,你应该总是显示地检查布尔值。

Lists

数组 Array 是几乎所有编程语言中最常见的集合类型,在 Dart 中数组由 List 对象表示。通常称之为 List。

Dart 中 List 字面量看起来与 JavaScript 中数组字面量一样。下面是一个 Dart List 的示例:

var list = [1, 2, 3];//这里 Dart 推断出 list 的类型为 List<int>,如果往该数组中添加一个非 int 类型的对象则会报错。

List 的下标索引从 0 开始,第一个元素的下标为 0,最后一个元素的下标为 list.length - 1。

如果想要创建一个编译时常量的 List,在 List 字面量前添加 const 关键字即可。

扩展操作符(…)和 null-aware 扩展操作符(…?)

Dart 在 2.3 引入了 扩展操作符(…)和 null-aware 扩展操作符(…?),它们提供了一种将多个元素插入集合的简洁方法。

例如,你可以使用扩展操作符(…)将一个 List 中的所有元素插入到另一个 List 中:

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

如果扩展操作符右边可能为 null ,你可以使用 null-aware 扩展操作符(…?)来避免产生异常:

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

在 Dart 中,set 是一组特定元素的无序集合。 Dart 所支持的 set 由 set literals(Set 字面量) 和 Set 类所提供。 Set 字面量(literals) 是在 Dart2.2 中加入的。

下面是使用 Set 字面量来创建一个 Set 集合的方法:

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

可以使用在 {} 前加上类型参数的方式创建一个空的 Set,或者将 {} 赋值给一个 Set 类型的变量:

var names = <String>{}; // 类型+{}的形式创建Set。
// Set<String> names = {}; // 声明类型变量的形式创建 Set (This works, too).
// var names = {}; // 这样的形式将创建一个 Map 而不是 Set (Creates a map, not a set.)

注意:Map 字面量语法同 Set 字面量语法非常相似。因为先有的 Map 字面量语法,所以 {} 默认是 Map 类型。如果忘记在 {} 上注释类型或赋值到一个未声明类型的变量上,那么 Dart 会创建一个类型为 Map<dynamic, dynamic> 的对象。

从 Dart 2.3 开始,Set 可以像 List 一样支持使用扩展操作符(… 和 …?)以及 Collection If 和 Collection For 操作。

Maps

通常来说, Map 是用来关联 keys 和 values 的对象。 keys 和 values 可以是任何类型的对象。在一个 Map 对象中一个 key 只能出现一次。但是 value 可以出现多次。 Dart 中 Map 通过 Map 字面量和 Map 类型来实现。通常来说,Map 是一个键值对相关的对象。其中键和值都可以是任何类型的对象。每个 键 只能出现一次但是 值 可以重复出现多次。 Dart 中 Map 提供了 Map 字面量以及 Map 类型两种形式的 Map。

下面是一对使用 Map 字面量创建 Map 的例子:

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

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

注意:Dart 将 gifts 变量的类型推断为 Map<String, String>,而降 nobleGases 的类型推断为 Map<int, String>。如果你向这两个 Map 对象中添加不正确的类型值,将导致运行时异常。

当然,我们也可以使用 Map 的构造器创建 Map对象。

从 Dart 2.3 Map 可以像 List 一样支持使用扩展操作符(… 和 …?)以及 Collection If 和 Collection For 操作。

小结


本文介绍了Dart的语法基础:数据类型。

  1. Dart 是代码类型安全的语言,但是由于其支持类型推断,因此大多数变量不需要显式地指定类型。
  2. Dart 中所有的对象都是对应一个类的实例。无论是int、函数和 null 等都是对象。
  3. Dart 中所有对象继承自 Object 类。
  4. Dart 没有 byte、char 和 float,并且int、double都是 64 位。
  5. 如果要明确说明不需要任何类型,需要使用特殊类型 dynamic,dynamic 会告诉编译器,我们知道自己在做什么,不用做类型检测。

ps:如果觉得本文对你有所帮助,请在文章下方 “点赞” 和 “收藏” 支持下吧~😁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卜大爷

觉得不错的可以给我加油哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值