Flutter学习之Dart语言基础(内置类型)
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 -> intvar one = int.parse('1');print('one: $one');// String -> doublevar onePointOne = double.parse('1.1');print('onePointOne: $onePointOne');// int -> StringString oneAsString = 1.toString();print('oneAsString: $oneAsString');// double -> StringString piAsString = 3.14159.toStringAsFixed(2);print('piAsString: $piAsString');//打印:
//one: 1
//onePointOne: 1.1
//oneAsString: 1
//piAsString: 3.14
复制代码
传统位移操作:
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((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 =
'''
A
multiline
string
''';var string2 =
"""
Another
multiline
string
""";print(string1);
print(string2);//打印:
A
multiline
stringAnother
multiline
string
复制代码
连接字符串:
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';@overrideString 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<String> 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<String> set1 = new Set();
set1.add('A');
set1.add('B');
set1.add('C');
set1.add('D');
set1.add('E');
set1.add('F');Set<String> 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<String> set1 = new Set();
set1.add('A');
set1.add('B');
set1.add('C');Set<String> 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<String> set1 = new Set();
set1.add('A');
set1.add('B');
set1.add('C');Set<String> 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<String> set1 = new Set();
set1.add('1');
set1.add('2');
set1.add('E');
set1.add('F');
set1.add('G');Set<String> 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<String, String>
var gifts = {// Key: Value'first': 'partridge','second': 'turtledoves','fifth': 'golden rings'
};//类型为Map<int, String>
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编码的string
print(clapping);
print('string code unit: ${clapping.codeUnits}'); //两个代码单元
print('string code point: ${clapping.runes.toList()}'); //一个代码点Runes runes = new Runes('\u{1f44f}'); //创建一个使用UTF-32编码的Runes
print('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的时候调用了fromCharCodes
print(sInput);//打印 ->
//♥ ? ? ? ? ?
//♥ ? ? ? ? ?
复制代码
方法源码为:
external factory String.fromCharCodes(Iterable<int> charCodes,[int start = 0, int end]);
复制代码
如果传递的charCodes为UTF-16的代码单元,则逐字复制 如果传递的charCodes的值大于16位,则将其分解为代理项对:
var clef = new String.fromCharCodes([0x1D11E]); //大于 FFFF
clef.codeUnitAt(0); // 0xD834
clef.codeUnitAt(1); // 0xDD1E
复制代码
Symbols
主要是反射用,现在mirrors模块已经被移除
Flutter学习之Dart语言基础(内置类型)相关推荐
- Flutter学习之Dart语言注释
文章目录 1.单行注释 2.多行注释 3.文档注释 高效Dart注释 注释 注释句子化 避免使用块注释 文档注释 使用 /// 注释成员和类型 优先为public的接口编写注释 考虑写一个库级别的文档 ...
- Flutter学习笔记-Dart语言学习(五)
内置类型(二) Lists 数组 (Array) 是几乎所有编程语言中最常见的集合类型,在 Dart 中数组由List对象表示.通常称之为 List. Dart 中的列表字面量是由逗号分隔的一串表达式 ...
- Flutter开发之Dart语言基础
Flutter 发展历史 Flutter是Google开发的一款用于帮助开发者在iOS和Android两个平台构建高质量原生应用的全新移动UI框架.说到Flutter,很多同学可能会将它和下面的几个词 ...
- Flutter 学习 - Dart 语言基础
文章目录 前言 一.Dart 概述 Dart 重要的概念 二.变量与基本数据类型 三.函数 四.运算符 五.流程控制语句 六.异常处理 七.面向对象 构造函数 继承类 抽象类 枚举类型 八.泛型 九. ...
- Dart语言基础,看完这篇文章就够了(二)
文章内容是我在学习Flutter过程中对知识点的梳理和总结.如有不对的地方,欢迎指出. 本文承接Dart语言基础,看完这篇文章就够了(一),进一步了解Dart语法知识. 文章目录 1 流程控制语句 2 ...
- dart语言基础_变量声明
作为Flutter的首席语言,如果要玩Flutter的同学就不得不学习一下dart语言.当然,其实也不需要怎么学习,因为你会在dart语言中发现许多其它语言的影子,可以说是集百家所长,颇有某企鹅的风范 ...
- (一)Flutter 学习之 Dart 变量和类型系统
Flutter系列文章目录导读: (一)Flutter学习之Dart变量和类型系统 (二)Flutter学习之Dart展开操作符 和 Control Flow Collections (三)Flutt ...
- Dart语言基础Map、List、Set操作合辑
题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. ** 你可能需要 CSDN 网易云课堂教程 掘金 EDU学院教程 知乎 Flutter系列文章 Flutter完全采用 ...
- (四)Flutter 学习之 Dart 操作符、控制流和异常处理
Flutter系列文章目录导读: (一)Flutter学习之Dart变量和类型系统 (二)Flutter学习之Dart展开操作符 和 Control Flow Collections (三)Flutt ...
最新文章
- 【开源项目】之智能鞋柜(STM32)
- 路由跟踪工具0trace
- SecureCRT使用
- [C++]怎么样实现一个较快的Hash Table
- 设计模式(九)——适配器模式
- 好的可视化报告一目了然,丑的可视化报表一文不值
- 从一个基础Javascript面试题谈起
- Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38%
- 使用IConfigurationSectionHandler在web.config中增加自定义配置
- 耳挂式蓝牙耳机原理_专为运动而生的DOSS T63无线蓝牙耳挂式运动耳机
- cisco 交换机 获取 转发表_看完这份1113页的TCP/IP协议+路由与交换机,成功上岸字节跳动...
- 牛腩新闻发布系统—错误总结
- Android Studio生成.aar文件、.jar文件和反编译.aar的class文件
- 嘉兴学院c语言期末考试题库,液压与气压传动(嘉兴学院)知到APP答案
- Nature:16年前的论文生成软件SCIgen至今仍有人用,骗过同行评审,论文被接收...
- dw建站404问题,dw 404
- 解决word里没有Endnote加载项
- 爬虫:利用python+requests爬取全国肯德基餐厅门店信息,并写入CSV文件中
- ubuntu返回图形界面_Ubuntu设置命令行界面和图形界面切换方法
- 中关村互联网教育创新中心:这里是互联网教育的主场
热门文章
- 怀孕后可使用计算机吗,怀孕了可以用电脑吗 准妈妈用电脑要谨记10个方面
- 912计算机专业综合,西安交通大学2018年计算机考研814、912考试大纲
- rtsp 和 rtmp 推流(一)
- git push 拒绝连接_git push被拒绝的处理方式
- Android系统换字体不root,小编吐血整理,超实用免ROOT 安卓手机换字体软件
- Pycharm 许可证过期解决
- adobe illustrator 绘制 立方体
- android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。
- 用Java写一个五子棋小游戏
- Google Earth网页版初探