博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter学习之Dart语言基础(内置类型)
阅读量:6819 次
发布时间:2019-06-26

本文共 8801 字,大约阅读时间需要 29 分钟。

Dart支持以下内置类型:

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

dart中数字有两种变量:

  • int 整数值不大于64位,取决于平台。Dart虚拟机中,值可以是-263 到 263 - 1

  • double 64位(双精度)浮点数,由IEEE 754标准规定。

  • int 和 double都是num的子类

num类型可进行加基本的运算,例如加减乘除,更多运算可以参考dart:math库

整数是没有小数点的数字。 以下是定义整数的一些示例:

var x = 1;var hex = 0xDEADBEEF; //十六进制复制代码

如果数字包含小数,则为双精度数:

var y = 1.1;var exponents = 1.42e5;复制代码

从Dart 2.1开始,必要时整数会自动转换为双精度数:

double z = 1;   print("$z"); //打印 -> 1.0复制代码

以下是将字符串和数字互相转换的示例:

// String -> int  var one = int.parse('1');  print('one: $one');  // String -> double  var onePointOne = double.parse('1.1');  print('onePointOne: $onePointOne');  // int -> String  String oneAsString = 1.toString();  print('oneAsString: $oneAsString');  // double -> String  String piAsString = 3.14159.toStringAsFixed(2);  print('piAsString: $piAsString');//打印://one: 1//onePointOne: 1.1//oneAsString: 1//piAsString: 3.14复制代码

传统位移操作:

assert((3 << 1) == 6); // 0011 << 1 == 0110assert((3 >> 1) == 1); // 0011 >> 1 == 0001assert((3 | 4) == 7); // 0011 | 0100 == 0111复制代码
Strings
  • Dart 字符串是使用UTF-16 编码的,可以使用单引号或者双引号来创建字符串
  • 可以使用三个单引号或者双引号创建多行字符串对象
  • 可以使用 r 前缀创建”原始raw”字符串。
  • 可以在字符串中使用表达式: ${expression},如果表达式是一个标识符,可以省略 {},如果表达式的结果为一个对象,则 Dart 会调用对象的 toString() 函数来获取一个字符串。

创建字符串:

var s1 = 'Single quotes work well for string literals.';var s2 = "Double quotes work just as well.";var s3 = 'It\'s easy to escape the string delimiter.';var s4 = "It's even easier to use the other delimiter.";复制代码

多行字符串:

var string1 ='''Amultilinestring''';var string2 ="""Anothermultilinestring""";print(string1);print(string2);//打印:AmultilinestringAnothermultilinestring复制代码

连接字符串:

var s1 = 'String '    'concatenation'    " works even over line breaks.";var s2 = 'The + operator ' + 'works, as well.';//打印://String concatenation works even over line breaks.//The + operator works, as well.复制代码

原始Raw字符串(原始字符串是比较特殊的字符串,在原始字符串中,字符“\” 不再表示转义字符的含义):

var s = r'In a raw string, not even \n gets special treatment.';//打印://In a raw string, not even \n gets special treatment.复制代码

表达式字符串:

class Expression{  String getName() => 'Expression';  @override  String toString() {    return 'This is in Expression class';  }}void main() {  var expression = new Expression();  print(expression);  print('name: ${expression.getName()}');}//打印 ->//This is in Expression class//name: Expression复制代码
Booleans

为了表示布尔值,Dart有一个名为bool的类型。 只有两个对象具有bool类型:boolean true和false,它们都是编译时常量。

Dart中bool对象未初始化的默认值是null:

bool bb;if (bb == false){  print('It\s false.');} else{  print('It\s true.');}//打印 -> //Its true.复制代码

因为bb为null,所以不等于false,因此这里打印null。

Lists

也许几乎每种编程语言中最常见的集合是数组或有序的对象组。 在Dart中,数组是List对象,因此大多数人只是将它们称为List。 这是一个简单的Dart列表:

var list = [1, 2, 3];//打印 ->//[1, 2, 3]复制代码

Dart中可以直接打印list包括list的元素,List也是对象。java中直接打印list结果是地址值。

这里定义var list = [1, 2, 3]时,Dart推断list的类型为List 。 如果尝试将非整数对象添加到此列表,则分析器或运行时会引发错误。

Dart中List的下标索引和java一样从0开始:

var list = [5, 6, 7];for (int i = 0; i < list.length; i++){  print('index$i = ${list[i]}');}//打印 ->//index0 = 5//index1 = 6//index2 = 7复制代码

和java一样支持泛型

常用操作: 1.增删改查

var list = [5, 6, 7];list.add(8); //增list.remove(8); //删list[0] = 55; //改bool containsSix = list.contains(6); //查print('containssix: $containsSix');print(list);//打印 ->//contains six: true//[55, 6, 7]复制代码

2.倒序

var list = [5, 6, 7];print(list);print('after reversed: ${list.reversed}'); //并不会改变原本list顺序print(list);//打印 ->//[5, 6, 7]//after reversed: (7, 6, 5)//[5, 6, 7]复制代码

3.排序

var list = ['AAA', 'AA', 'AAAA'];print('before sort: $list');list.sort((a, b) => a.length.compareTo(b.length)); //根据字符串长度排序print('after sort: $list');//打印 ->//before sort: [AAA, AA, AAAA]//after sort: [AA, AAA, AAAA]复制代码

4.洗牌

var list = [1, 2, 3, 4, 5, 6, 7, 8, 9];print('before suffle: $list');list.shuffle();print('after suffle: $list');//打印 ->//before suffle: [1, 2, 3, 4, 5, 6, 7, 8, 9]//after suffle: [8, 3, 2, 7, 5, 9, 4, 1, 6]复制代码

5.合并

var list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];var list2 = [11, 12, 13, 14, 15, 16, 17, 18, 19];var list3 = list1 + list2;print('list3: $list3');//打印 ->//list3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19]复制代码
Sets

Dart中的集合(set)是没有顺序且不能重复的集合,所以不能通过索引去获取值:

Set
set = new Set();set.add('A');set.add('B');set.add('C');set.add('D');set.add('E');set.add('F');set.add('G');set.add('A');set.add('B');//打印 >//{A, B, C, D, E, F, G}复制代码

常用操作: 1.difference: 返回set1集合里有但set2里没有的元素集合

Set
set1 = new Set();set1.add('A');set1.add('B');set1.add('C');set1.add('D');set1.add('E');set1.add('F');Set
set2 = new Set();set2.add('A');set2.add('1');set2.add('2');set2.add('3');set2.add('4');set2.add('5');print('difference: ${set1.difference(set2)}');//打印 ->//difference: {B, C, D, E, F}复制代码

2.交集intersection: 返回set1和set2的交集

Set
set1 = new Set();set1.add('A');set1.add('B');set1.add('C');Set
set2 = new Set();set2.add('A');set2.add('A');set2.add('B');set2.add('1');print('intersection: ${set1.intersection(set2)}');//打印 ->//intersection: {A, B}复制代码

3.并集union:返回set1和set2的并集

Set
set1 = new Set();set1.add('A');set1.add('B');set1.add('C');Set
set2 = new Set();set2.add('1');set2.add('2');set2.add('3');print('union: ${set1.union(set2)}');//打印 ->//union: {A, B, C, 1, 2, 3}复制代码

4.retainAll():set1保留某些元素(删除所有set1中有而set2中没有的元素即保留set1和set2同时存在的元素)

Set
set1 = new Set();set1.add('1');set1.add('2');set1.add('E');set1.add('F');set1.add('G');Set
set2 = new Set();set2.add('A');set2.add('B');set2.add('C');set2.add('1');set2.add('2');set2.add('3');set1.retainAll(set2);print('retainAll: $set1');//打印 ->//retainAll: {1, 2}复制代码
Maps

通常,map是关联键和值的对象,dart中可以通过以下方式创建map:

//类型为Map
var gifts = { // Key: Value 'first': 'partridge', 'second': 'turtledoves', 'fifth': 'golden rings'};//类型为Map
var nobleGases = { 2: 'helium', 10: 'neon', 18: 'argon',};print(gifts);print(nobleGases);//打印 ->//{first: partridge, second: turtledoves, fifth: golden rings}//{2: helium, 10: neon, 18: argon}复制代码

如果尝试将错误类型的值添加到任一映射,则分析器或运行时会引发错误(这里gifts添加一个key为2value为what的数据)

也可以使用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';//打印 ->//{first: partridge, second: turtledoves, fifth: golden rings}//{2: helium, 10: neon, 18: argon}复制代码

常用操作: 1.新增键值对

var gifts = {
'first': 'partridge'};gifts['fourth'] = 'calling birds'; print(gifts);//打印 ->//{first: partridge, fourth: calling birds}复制代码

2.获取一个值

var gifts = Map();gifts['first'] = 'partridge';gifts['second'] = 'turtledoves';print("first: ${gifts['first']}");print("second: ${gifts['second']}");print("fifth: ${gifts['fifth']}"); //map中并没有该键值对,返回null//打印 ->//first: partridge//second: turtledoves//fifth: null复制代码

3.两个map相加:

var map1 = {'a' : 10,'b' : 11,'c' : 12,};var map2 = {'a' : 10,'e' : 20,'f' : 21,'g' : 22,};map1.addAll(map2);print('map1 + map2 = $map1');//打印 ->//map1 + map2 = {a: 10, b: 11, c: 12, e: 20, f: 21, g: 22} 复制代码
Runes

在Dart中,runes是字符串的UTF-32代码点。 由于Dart字符串是UTF-16代码单元的序列,因此在字符串中表示32位Unicode值需要特殊语法。

我们知道, 在Unicode字符集中的某个字符对应的代码值,称作代码点(Code Point),用16进制表示,通常加上U+前缀,Dart中则为\u。比如,‘你’的代码点是\u4f60;‘好’的代码点是\u597d。要指定多于或少于4个十六进制数字,请将值放在大括号中, 例如,笑的表情符号(?)是\u {1f600}。

我们这里需要了解两个概念: 代码点(code point):是指编码字符集中,字符所对应的数字,占用一个 Unicode 编码位的字符。有效范围从U+0000到U+10FFFF。其中U+0000到U+FFFF为基本字符,U+10000到U+10FFFF为增补字符。

代码单元(code unit):表示指定编码格式编码的数量,对于小于 U+FFFF 的字符来说,使用 UTF-16 编码需要一个代码点,大于 U+FFFF 的字符需要使用两个代码点来表示。

更多Unicode相关知识可自行百度。

以下示例说明了runes,16位代码单元和32位代码点之间的关系:

var clapping = '\u{1f44f}';  //创建一个使用UTF-16编码的stringprint(clapping);print('string code unit: ${clapping.codeUnits}'); //两个代码单元print('string code point: ${clapping.runes.toList()}'); //一个代码点Runes runes = new Runes('\u{1f44f}'); //创建一个使用UTF-32编码的Runesprint('runes code point: ${runes.toList()}'); //一个代码点//打印-> //?//string code unit: [55357, 56399]//string code point: [128079]//runes code point: [128079]复制代码

可以看到使用UTF-16编码的clpping的代码点和使用UTF-32编码的Runes是一样的,那Runes到底作用是什么? Runes其实是一个用UTF-32进行编码的的String。

var sInput =  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}'; //使用UTF-16进行编码Runes input = new Runes(  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}'); //使用UTF-32进行编码print(new String.fromCharCodes(input)); //UTF-32转UTF-16的时候调用了fromCharCodesprint(sInput);//打印 ->//♥  ?  ?  ?  ?  ?//♥  ?  ?  ?  ?  ?复制代码

方法源码为:

external factory String.fromCharCodes(Iterable
charCodes, [int start = 0, int end]);复制代码

如果传递的charCodes为UTF-16的代码单元,则逐字复制 如果传递的charCodes的值大于16位,则将其分解为代理项对:

var clef = new String.fromCharCodes([0x1D11E]); //大于 FFFFclef.codeUnitAt(0); // 0xD834clef.codeUnitAt(1); // 0xDD1E复制代码
Symbols

主要是反射用,现在mirrors模块已经被移除

转载于:https://juejin.im/post/5c9897455188252d9b376db3

你可能感兴趣的文章
流媒体技术学习笔记之(八)海康、大华IpCamera RTSP地址和格式
查看>>
[React] Test friendly approach
查看>>
MySQL InnoDB 引擎的持久性与性能
查看>>
java------HashMap与HashSet的区别
查看>>
GaugeControl 之 DigitalGauge
查看>>
Mysql之sql语句操作
查看>>
C#中按模板操作Word —— 如何向Word中插入图片
查看>>
Linux设备驱动--块设备(三)之程序设计
查看>>
【前端】:jQuery下
查看>>
安卓解析 json 4种格式 全解析
查看>>
asd
查看>>
北斗有 35 颗卫星,而 GPS 有 24 颗卫星,为什么二者数量不同?
查看>>
java中的类、成员变量、方法的修饰符。
查看>>
.NET Core配置文件加载与DI注入配置数据
查看>>
JAVA_StandardServer await create[8005]怎么办
查看>>
servlet与CGI的区别
查看>>
【Spring】3、BeanFactory 和 ApplicationContext的区别
查看>>
Sharpdevelop如何在项目中添加类文件
查看>>
百科知识 手机QQ的视频如何保存
查看>>
使用MySQL Workbench建立数据库,建立新的表,向表中添加数据
查看>>