请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 6317|回复: 7

Dart 数据类型,看这篇就够了!

[复制链接]

17

主题

22

帖子

166

积分

注册会员

Rank: 2

积分
166
发表于 2020-1-27 07:45:25 | 显示全部楼层 |阅读模式
前言

如果你对 Dart 语言一无所知,推荐你先翻阅一些概念性解释,请访问 这篇文章
如果你没有 Dart 环境,请使用在线编辑器,传送门
Dart 支持以下数据类型:

  • 数字(number)
  • 字符串(string)
  • 布尔值(boolean)
  • 列表(list)
  • 集合(set)
  • 映射(map)
  • 符文(rune)
  • 符号(Symbol)
数字(number)

Dart 中数字类型用于表示数字文字,Dart 中的数字类型分为整数和双精度数两种,整数值不大于64位, 具体取决于平台。
你可以使用 int / double 关键字来显式声明一个整型 / 双精度变量:
  1. int a = 10;int b = 0xDEADBEEF;double c = 3.14;double d = 1.42e5;
复制代码
另外,Dart 支持自动推断数据类型,所以你也可以像JS一样使用 var 关键字来声明:
  1. var a = 88;var b = 5.65;
复制代码
字符串(String)

Dart 字符串是一组 UTF-16 单元序列,用于存储一些姓名地址等信息,并用双引号或单引号包裹。
你可以使用 String 关键字来显式声明一个字符串类型的变量:
  1. String str1 = 'hello';String str2 = "hello";
复制代码
同样,你也可以让 Dart 自动推断类型:
  1. var str = 'hello world!';
复制代码
Dart 允许你使用 + 号进行字符串的拼接:
  1. String str = 'hello ' + 'world!';print(str); //hello world!
复制代码
Dart 允许你使用连续三个单引号或者三个双引号实现多行字符串(保留缩进格式):
  1. String str = '''   格式会保留,  你看。''';print(str); //  格式会保留,//  你看。
复制代码
当然,最简洁的写法是通过 ${expression} 方式内嵌表达式,就像ES6的字符串模板语法:
  1. String str = 'null';String newStr = '这是${str}';print(newStr); //这是null
复制代码
布尔值(boolean)

Dart 只有字面量 true / false 是布尔类型,这两个对象都是编译时常量。
你可以使用 bool 关键字定义一个布尔值变量:
  1. bool a = true;bool b = false;
复制代码
同样,你也可以让 Dart 自动推断类型:
  1. var c = true;
复制代码
列表(list)

其实 list 就是编程语言中常见的数据类型 Array(数组),但在 Dart 中用 List 对象表示数组。
你可以使用 list 关键字定义一个列表:
  1. List arr = [1,2,3];
复制代码
你也可以使用构造函数定义一个列表:
  1. var ls = new List();print(ls);//[]
复制代码
构造函数创建的 List 对象同样可以指明类型,一旦指明则无法添加其他类型数据:
  1. var ls = new List();// 取消注释则会报错// ls.add(1);
复制代码
但要注意,一旦声明了 int 类型,你就无法添加其他类型的值:
  1. // "4" StringList arr = [1,2,3,"4"];// Error: Compilation failed.
复制代码
Dart 中的 List 字面量非常像 JavaScript 中的 array 字面量,所以你尽可能让 Dart 自动推断类型:
  1. var arr = [1,2,3];
复制代码
注意,Dart 推断 arr 的类型为 List 。 如果尝试将非整数对象添加到此 List 中,则分析器或运行时会引发错误,就像上面所述(Error: Compilation failed.)。
如果你想定义 List 类型的编译时常量,那么你需要在 List 字面量之前添加 const 关键字:
  1. // create listvar arr = const ["常量", "不可再运行时更改"];
复制代码
最后,数组的访问与 JavaScript 非常相似:
  1. var arr = const ["我是0", "我是1"];print(arr[0]);//我是0
复制代码
集合(Set)

顾名思义,其实就是一组同类型数据的集合。在 Dart 中 Set 是一个元素唯一且无需的集合。 Dart 为 Set 提供了 Set 字面量和 Set 类型。
版本提示: 虽然 Set 类型 一直是 Dart 的核心部分, 但在 Dart2.2 中才引入了 Set 字面量 。
你可以使用 set 关键字来定义一个集合:
  1. Set  cls = {"小王", "小杨"};
复制代码
但要注意,一旦声明了 String 类型,你就无法添加其他类型的值:
  1. Set  cls = {"小王", "小杨", true}; // Error: Compilation failed.
复制代码
采用字面量方式创建,即 var 关键字:
  1. var cls = {true,false};
复制代码
注意,Dart 推断 cls 的类型为 Set 。 如果尝试将非布尔对象添加到此 Set 中,则分析器或运行时会引发错误,就像上面所述(Error: Compilation failed.)。
如果你想定义 Set 类型的编译时常量,那么你需要在 Set 字面量之前添加 const 关键字:
  1. final b = const {   "one",   "tow"};// 尝试运行时添加b.add("three");// Cannot change unmodifiable set
复制代码
要创建一个空集,使用前面带有类型参数的 {} ,或者将 {} 赋值给 Set 类型的变量:
  1. Set  a = {};var b = {};// testprint(a);//{}print(b);//{}
复制代码
注意,初学者可能很容易和下面要介绍的 Map ,也就是 Object(对象)混淆,这两者语法非常相似, 因为先有的 Map 字母量语法,所以 {} 默认是 Map 类型。
这样写,就是创建的空 Map 对象而不是 Set 对象,请注意语法上的细节:
  1. var obj = {};print(obj.runtimeType.toString());//JsLinkedHashMap// Map
复制代码
映射(Map)

不严格地说,你可以把它看作为 Object / JSON 。 Map 是用来关联 keys 和 values 的对象。 keys 和 values 可以是任何类型的对象。在一个 Map 对象中一个 key 只能出现一次。 但是 value 可以出现多次。
你可以使用 var 创建一个 Map 对象,这和 JavaScript 非常相似:
  1. var person = { // Key:    Value   'name': '杨莹',   'age': '18',   'eat': 'true'};var nobleGases = { // Key:    Value    2: 'react',    10: 'vue',    18: 'spring boot'};print(person);// {name: 杨莹, age: 18, eat: true}print(nobleGases);// {2: helium, 10: neon, 18: argon}
复制代码
请注意,Dart 会将 person 的类型推断为 Map,nobleGases 的类型推断为 Map 。 如果你尝试在上面的 map 中添加错误类型,那么分析器或者运行时会引发错误。
当然,通过 Map 构造函数创建也是不错的选择:
  1. var obj = Map();obj['name'] = '杨莹';obj['age'] = 18;print(obj);// {name: 杨莹, age: 18}
复制代码
请注意,这里为什么只有 Map() ,而不是使用 new Map()。在 Dart 2 中,new 关键字是可选的,具体可以参考 构造函数的使用。
获取到 key-value 可以通过以下语法获得:
  1. var person = {   'name': '杨莹',   'age': 18};  print(person['name']); //杨莹print(person['age']); //18
复制代码
使用 .length 函数获取当前 Map 中的 key-value 对数量:
  1. var obj = new Map();obj['flag'] = true;print(obj.length);//1
复制代码
如果 Map 中不包含所要查找的 key,那么 Map 返回 null:
  1. var obj = {'name':'杨莹'};assert(obj['age'] == null);//null
复制代码
从上面所有类型可得知,Dart 可以创建运行时常量和编译时常量,那么 Map 也不例外:
  1. final constantMap = const {    1: 'one',    2: 'two'};// constantMap[3] = 'three';
复制代码
此时你若再程序运行时动态改变(取消上面的注释) constantMap 则会报错。
符文(Rune)

由于该类型并不常用,甚至用不到,这篇不再贴代码只给出概念赘述 Rune。
在 Dart 中, Rune 用来表示字符串中的 UTF-32 编码字符。
Unicode 定义了一个全球的书写系统编码, 系统中使用的所有字母,数字和符号都对应唯一的数值编码。 由于 Dart 字符串是一系列 UTF-16 编码单元, 因此要在字符串中表示32位 Unicode 值需要特殊语法支持。
表示 Unicode 编码的常用方法是, \uXXXX, 这里 XXXX 是一个4位的16进制数。 例如,心形符号 (♥) 是 \u2665。 对于特殊的非 4 个数值的情况, 把编码值放到大括号中即可。 例如,emoji 的笑脸 (�) 是 \u{1f600}。
谨慎使用 list 方式操作 Rune 。 这种方法很容易引发崩溃, 具体原因取决于特定的语言,字符集和操作。
符号(Symbol)

由于该类型并不常用,甚至用不到,这篇不再贴代码只给出概念赘述 Symbol。
一个 Symbol 对象表示 Dart 程序中声明的运算符或者标识符。 你也许永远都不需要使用 Symbol ,但要按名称引用标识符的 API 时, Symbol 就非常有用了。 因为代码压缩后会改变标识符的名称,但不会改变标识符的符号。 通过字面量 Symbol ,也就是标识符前面添加一个 # 号,来获取标识符的 Symbol 。
就像 #bar ,但要注意 Symbol 字面量是编译时常量。
                                                                                                                                       
                                                    
  • 点赞                        1                        
  • 收藏                        
  • 分享                                                                                                                        
  •                                                         
                                      
    • 文章举报                           
                                                
                                                                        
                                            
                                                        王佳斌                                                                发布了239 篇原创文章 · 获赞 365 · 访问量 78万+                                                                                            他的留言板                                                            关注
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x




上一篇:使用 Python 和百度语音识别生成视频字幕
下一篇:剑指offer(1-10题)详解
回复

使用道具 举报

0

主题

15

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
发表于 2020-1-28 18:02:59 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享![www.12360.co]
回复

使用道具 举报

0

主题

17

帖子

367

积分

中级会员

Rank: 3Rank: 3

积分
367
发表于 2020-2-3 03:12:26 | 显示全部楼层
既然你诚信诚意的推荐了,那我就勉为其难的看看吧![www.12360.co]
回复

使用道具 举报

0

主题

15

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
发表于 2020-2-6 02:23:56 | 显示全部楼层
这东西我收了!谢谢楼主![www.12360.co]
回复

使用道具 举报

0

主题

16

帖子

346

积分

中级会员

Rank: 3Rank: 3

积分
346
发表于 2020-2-9 11:43:15 | 显示全部楼层
我看不错噢 谢谢楼主![www.12360.co]
回复

使用道具 举报

0

主题

18

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
发表于 2020-2-12 16:44:53 | 显示全部楼层
感谢楼主的无私分享![www.12360.co]
回复

使用道具 举报

0

主题

13

帖子

283

积分

中级会员

Rank: 3Rank: 3

积分
283
发表于 2020-2-14 05:59:42 | 显示全部楼层
其实我一直觉得楼主的品味不错!呵呵![www.12360.co]
回复

使用道具 举报

0

主题

23

帖子

493

积分

中级会员

Rank: 3Rank: 3

积分
493
发表于 7 天前 | 显示全部楼层
楼主,大恩不言谢了![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-29 13:44 , Processed in 0.104459 second(s), 26 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表