一、Flutter学习之Dart基本数据类型


阅读本文大概需要3分钟


Dart 内置了七种类型:Number、String、Boolean、List、Map、Runes、Symbol;


Number

其自类型有两种:

  • int,范围是-2^53 ~ 2^53;

  • double,64-bit (双精度) 浮点数,符合 IEEE 754 标准;

常见的运算符:+,-,*,/,~/(取整),%(取余),如下:

一、
int num;
print(num);
输出
null

二、
double num1=7.2;    
int num2=4;
运算    num1/numb2      num1~/numb2     num1%numb2
输出        1.8              1             3.2

常见的方法

一、内置:绝对值abs()、向下取整floor()、向上取整ceil()等
(1)num1.compareTo(num2)
num1 == num2,为0;num1 > num2,为1;num1 < num2,为-1;
(2)num.sign
num小于0,返回-1;num>0,返回1;num==0,返回0。 
(3)num.isNegative
如果num是负数,则返回true。
二、math库:开方sqrt()、正弦sin()等
导包:import 'dart:math';

String

Dart 字符串是 UTF-16代码单元(code units)的序列。

dart和Java文档对String描述:
dart:A Dart string is a sequence of UTF-16 code units. 
java:A String represents a string in the UTF-16 format in which supplementary characters are represented by surrogate pairs (see the section Unicode Character Representations in the Character class for more information). Index values refer to char code units, so a supplementary character uses two positions in a String.

可以使用单引号或者双引号来创建字符串:

var s1 = 'Single quotes';
var s2 = "Double quotes"; 

使用

一、可以在字符串中使用表达式,用法是这样的: ${expression}。如果表达式是标识符,可以省略 {}。 如果表达式的结果为一个对象,则 Dart 会调用对象的 toString() 函数来获取一个字符串。
 var s1 = 'zhuanzhuan';
 '$s1 转大写 : ${s1.toUpperCase()}'
二、 == 操作符判断两个对象的内容是否一样;
三、创建多行字符串的另一种方法:使用带有单引号或双引号的三重引号;
var s1 = '''
create
multi-line strings.
''';

Runes

在 Dart 中,runes是UTF-32 代码点(code points)的字符串。 用于在字符串中表示 Unicode 字符。

In Dart, runes are the UTF-32 code points of a string.
Unicode 为每一个字符、标点符号、表情符号等都定义了 一个唯一的数值。由于Dart字符串是一系列UTF-16代码单元,因此在字符串中表示32位Unicode值需要特殊语法。
表达Unicode代码点的常用方法是 \uXXXX,其中XXXX是4位十六进制值。例如,心()是\u2665。要指定多于或少于4个十六进制数字,请将值放在大括号中。例如,笑表情符号()是\u{1f600}。
String类有几个属性,你可以用它来提取符文信息。在codeUnitAt和codeUnit属性返回16位代码单元。使用该runes属性获取字符串的符文。
以下示例说明了Runes、16位代码单元和32位代码点之间的关系。。
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());

Runes input = new Runes(
    '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
print(new String.fromCharCodes(input));
  
输出:

[55357, 56399]
[128079]
         

Boolean

只有两个对象是布尔类型的:true 和 false。

List

数组或有序的对象组;下标索引从 0 开始。

使用

一、创建List方式
//1
var vlist = [3, 2, 5];
//2
var vlist = new List();
//3、增加泛型
var vlist = new List<int>();
//4、创建固定长度的数组,不能增加或移除
var vlist = new List(3);
//5、创建包含所有元素的可改变长度列表
var vlist = new List.from([1, 2, 3]);
//6、创建可在固定范围内改变长度的列表
var vlist = new List()..length = 5;
//7、创建包含所有元素的固定长度列表
var vlist = new List.unmodifiable([1, 2, 3]);
//8、用生成器给所有元素赋初始值
var vlist = new List<int>.generate(4, (int index) {
   return index * index;
});
二、常用方法
List<int> vlist = [3, 2, 5];

//获取list长度
list.length
//添加
vlist.add(5);
//移除
vlist.removeAt(index); 或 vlist.remove(value);
//移除列表中满足条件的对象
vlist.removeWhere((item) => item == 3)
//移除列表中不满足条件的对象
vlist.retainWhere((item) => item == 3);
//遍历list,方式一
vlist.forEach((item) {
  append = append + 'index: ${vlist.indexOf(item)}, item:${item}\n';
});
//遍历list,方式二
for (int i = 0; i < vlist.length; i++) {
  append = append + 'index: ${i}, item:${vlist[i]}\n';
}
//排序
vlist.sort((a, b) => a.compareTo(b));

Map

键值对相关的对象。键和值可以是任何类型的对象。每个键只出现一次, 而一个值则可以出现多次。

使用

一、创建Map方式
//1、
var map = new Map<String, String>();
//2、
var map = Map.of(map);
//3、
var map = {
    'first': 'FIRST',
    'second': 'SECOND',
    'three': 'THREE'
};
//4、
var map =Map.of(map);
//5、
var map = Map.fromEntries(map.entries);
//6、
var map = Map.identity();
//7、
var map = Map.unmodifiable(map);
//8、
List<String> keys = ['aaa', 'bbb'];
List<String> values = ['ccc', 'ddd'];
map = Map.fromIterables(keys, values);
二、常用方法
//获取map长度
map.length
//添加元素(如果key已存在,则是更新value)
map['four'] = "first";
//添加(如果key不存在,则添加,否则,不添加)
map.putIfAbsent(key, () => key.toUpperCase());
//移除
map.remove(key)
//移除满足条件的键值对
map.removeWhere((key, value) => (key == "first"));
//是否为空
map.isNotEmpty;或 map.isEmpty;
//遍历
map.forEach((key, value) {
    append = append + 'key: $key, value:$value\n';
});

Symbol

Symbol object 代表 Dart 程序中声明的操作符或者标识符。 您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,特别是混淆后的代码, 标识符的名字被混淆了,但是 Symbol 的名字不会改变。

一、
print(#s == new Symbol('s'))
输出
true

二、
var name = 'zhuanzhuan';
Symbol symbol = #name;
print(symbol);
print(#name);
输出
Symbol("name");
Symbol("name");

总结:

1、Dart 的所有东西都是对象,包括数字,它们都继承自 Object ,默认是都是 null;
2,数字,字符串都可以调用各种方法;

补充:

- Unicode所做的事情就是将我们需要表示的字符表中的每个字符映射成一个数字,这个数字被称为相应字符的码点(code point)。例如“严”字在Unicode中对应的码点是U+0x4E25。

- 代码点(Code Point):是指与一个与Unicode编码字符集中某个字符对应的代码值。在Unicode标准中,码点采用十六进制书写,并加上前缀U+,例如U+0041就是拉丁字母A的码点。

- 代码单元(Code Unit):对代码点进行编码得到的1或2个16位序列(UTF-16)。

- 代码单元(Code Unit):是指一个已编码的文本中具有最短的比特组合的单元。对于UTF-8来说,代码单元是8比特长;对于UTF-16来说,代码单元是16比特长。换一种说法就是UTF-8的是以一个字节为最小单位的,UTF-16是以两个字节为最小单位的。
- 代码单元是把代码点存放到计算机后出现的概念。一个字符集,比如有10个字符,每一个字符从0到9依次编码。那么代码点就是0、1、。。。、9。为了在计算机中存储这10个代代码点,一个代码点给一个字节,那么这里的一个字节就是一个代码单元。比如Unicode是一个编码字符集,其中有65536个字符,代码点依次为0、1、2、。。。、65535,为了在计算机中表示这些代码点就出现了代码单元,65536个代码点为了统一表示每个代码点必须要有两个字节表示才行。但是为了节省空间0-127的ASCII码就可以不用两个字节来表示,只需要一个字节,于是不同的表示方案就形成了不同的编码方案,比如utf-8、utf-16等。对utf-8而言代码单元就是一个字节,对utf-16而言代码单元就是两个字节。

参考文档

[dart文档](https://www.dartlang.org/guides/language/language-tour#runes)
[Unicode、UTF-8、UTF-16、UTF-32、code point、code unit](https://blog.csdn.net/B321MW/article/details/8808284)
[字符编码笔记:ASCII,Unicode 和 UTF-8](http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html)
[Java中的字符集编码入门](http://www.360doc.com/content/12/0420/13/9470897_205152817.shtml)
一、Flutter学习之Dart基本数据类型
喜欢的话,可以关注公众号哦