用Flutter极速构建原生应用
上QQ阅读APP看书,第一时间看更新

2.3 Dart中的内置数据类型

通过前面的学习,对于数据类型你已经有了简单的理解。在Dart中,万事万物皆是对象。也就是说,无论是什么类型的数据,其都是某个类的实例,在Dart中,你可以使用字面量来创建这些对象,也可以使用类的构造器来创建这些对象(非抽象类)。

Dart中内置了7类特殊的数据类型,分别为numbers(数值类型)、strings(字符串类型)、booleans(布尔类型)、lists(列表类型)、maps(图类型)、runes(字符类型)和symbols(符号类型)。本节我们主要学习这些内置的数据类型。

2.3.1 数值类型

顾名思义,数值类型用来描述与数值相关的数据。在数学中,数有多种分类方法,比如可以分为整数、小数,也可以分为正数、负数等。在Dart中,数值类型有两种,分别为int和double。int是integer的缩写,用来描述整型数据;double是双精度浮点类型,即用64位来描述带有小数的数值。

可以使用字面量来直接创建数值对象,例如:

    int a = 99;
    int b = 0xA1;
    print(a);//99
    print(b);//161

如果使用0x开头定义数值,就表示使用十六进制数值。如果一个数值包含小数,就需要将其定义为double类型。我们也可以使用直接定义与指数定义来定义小数,例如:

    double c = 3.14;
    double d = 1.4e2;
    print(c);//3.14
    print(d);//140.0

e符号表示科学计数法,上面的1.4e2表示1.4乘以10的2次方,最终的结果为140。需要注意,虽然结果为整数,但其类型依然是double类型。在Dart 2.1版本后,整型数值是可以直接赋值给浮点型变量的,Dart会自动处理将其转换成浮点数,例如:

    double e = 1;
    print(e);//1.0

int和double类型中都定义了许多常用的属性和方法,通过属性我们可以获取许多关于当前数值对象的信息,例如:

数值类型中还定义了许多常用的方法,这个方法实际上就是函数,它们帮助开发者对数值数据进行操作,例如:

上面列举的方法都有详尽的注释,并且这些方法是int类型对象和double类型对象所通用的。对于int类型数据,其还可以调用许多独有的方法,例如:

2.3.2 字符串类型

字符串是编程中常用的数据类型。在Dart中,可以使用单引号或者双引号来创建字符串,例如:

    var str1 = "Hello";
    var str2 = 'World';

更多时候,我们需要对字符串进行格式化,例如将某个变量的值插入字符串中,或者将某个表达式的运算结果插入字符串中。在Dart中,使用$来进行字符串的格式化,例如:

需要注意,如果要将表达式的值插入字符串中,就需要使用大括号标记,即${}。

字符串也支持直接使用“+”运算符来进行拼接,示例如下:

    var str1 = "Hello";
    var str2 = 'World';
    print(str1+str2);//HelloWorld

其实,即使你不使用运算符,相邻的字符串也会自行进行拼接,例如:

    print('hello''world');//helloworld

使用3对单引号或者3对双引号可以进行多行字符串的创建,在某些应用场景下,这个语法特点十分有用,例如:

    var str5 = '''第一行
    第二行
    第三行''';
    var str6 = """第一行
    第二行
    第三行""";

和C语言类似,Dart中的字符串也支持使用反斜杠来进行字符的转译,常用的转译字符是引号与换行符,例如:

    print('hello \'珲少\'');//hello '珲少'
    //hello
    //world
    print("hello\nworld");

当然,如果你不想进行转译,想让字符串完全匹配其字面的意思,就可以使用原始字符串,例如:

    print(r"hello\nworld");//hello\nworld

上面的示例代码中,我们都是采用字面量直接进行字符串对象的创建的,其实也可以使用构造方法来创建字符串,例如:

    var str7 = String.fromCharCode(97);//字符码97对应字符a
    var str8 = String.fromCharCodes([97,98,99]);//abc

可以通过调用字符串对象的一些属性来获取当前字符串的相关信息,列举如下:

String类中的相关方法也可以帮助我们对字符串进行运算或修改,列举如下:

除了上面列举的方法外,如果要对字符串进行拷贝,就可以直接使用“*”运算符,例如:

    print("hello"*2);//hellohello

其实,字符串也是一种集合类型,在Dart中,集合类型的数据都可以使用中括号来获取集合内的某个元素,例如:

    print("hello"[0]);//h

2.3.3 布尔类型

布尔类型是Dart中一种简单的数据类型,其只有两个字面量值:true和false。

布尔类型虽然简单,却是编程中必不可少的数据类型。在实现复杂的逻辑分支时,往往需要判断大量的条件,布尔运算是条件运算的核心。定义布尔值的示例如下:

    bool a = true;
    bool b = false;

布尔类型非常简单,bool类中没有封装太多的属性,可以使用runtimeType来获取类型:

    bool a = true;
    bool b = false;
    print(a.runtimeType);//bool

可以调用布尔对象的toString方法来将布尔值转换成字符串,例如:

    bool a = true;
    print(a.toString());//true

2.3.4 列表类型

列表用来存放一组数据,在许多编程语言中,列表这种数据类型也被称为数组。在Dart中,列表具体的数据类型由其中的元素类型决定,例如下面是完整的声明列表变量的格式:

    List<int> list = [1,2,3,4];

其中,尖括号中的类型用来指定列表中元素的类型,如果列表明确了其中元素的类型,它就只能存放这种类型的数据,否则会产生运行时异常。例如下面的写法是不允许的:

    List<int> list = [1,2,3,4,"5"];

若想在列表中存放不同类型的数据,则可以将列表声明成动态类型的,例如:

    List<dynamic> list = [1,2,3,4,"5"];

其实更多时候,我们不需要手动指明列表的类型,可以利用Dart的类型推断特性,直接使用var进行声明即可,例如:

    var list = [1,2,3,4,"5"];

除了使用字面量来进行列表对象的创建外,我们还可以通过构造方法来创建,示例如下:

需要注意,使用new关键字调用构造方法是Dart的标准对象构造语法,Dart 2允许开发者在调用构造方法时省略new关键字,这使我们的代码看起来更加简洁清爽。

下面列举列表对象中的一些常用属性:

和字符串一样,列表也可以使用中括号进行取值或设置值,同样支持使用运算符进行相加操作,例如:

需要注意,在对列表中的值进行设置时,如果下标超出了列表元素的个数,就会产生溢出异常。

List类中封装了大量的实例方法,这些方法可以极大地提高开发者的工作效率,列举如下:

2.3.5 字典类型

相信你一定有过查词典的经历。以英汉词典为例,当你需要学习某个汉语词汇对应的英文词汇时,首先需要在索引处找到这个汉语词汇,不同的汉语词汇有可能会查到相同的英文词汇。字典数据类型也是这样的,更精确的说法是,字典是一组键值对的集合,通过键可以完成对值的修改、查找、添加或删除。在Dart中,字典类型叫作Map。

使用大括号可以通过字面量值创建字典对象,例如:

对于Map类型,在创建时,键和值要成对出现。一般情况下,键都是字符串类型的。但是在Dart中并没有严格的语法规定,键可以是任意类型的,值也可以是任意类型的。但是需要注意,与List类型一样,一旦Map的类型被确定,其键和值的类型就必须遵守。完整的Map类型变量的声明格式如下:

    //键为字符串类型、值为整数类型的字典
    Map<String,int> map2 = {"1":1,"2":2};

通过键可以实现对值的获取、设置和新增,例如:

Map对象中常用的属性列举如下:

同样,Map类中也封装了许多实例方法可以供我们直接使用,示例代码如下: