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 -> 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 == 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
string

Another
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';

  @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 <int>。 如果尝试将非整数对象添加到此列表,则分析器或运行时会引发错误。


lists.png

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一样支持泛型

generic.png

常用操作:
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}
set.png

常用操作:
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.png

也可以使用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模块已经被移除


Symbols.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容