Flutter學(xué)習(xí)之Dart語言基礎(chǔ)(內(nèi)置類型)

Dart支持以下內(nèi)置類型:

  • numbers
  • strings
  • booleans
  • lists (也稱為數(shù)組)
  • sets
  • maps
  • runes (用于在字符串中表示Unicode字符)
  • symbols
Numbers

dart中數(shù)字有兩種變量:

  • int
    整數(shù)值不大于64位兔跌,取決于平臺。Dart虛擬機(jī)中绸栅,值可以是-263 到 263 - 1

  • double
    64位(雙精度)浮點(diǎn)數(shù)海诲,由IEEE 754標(biāo)準(zhǔn)規(guī)定繁莹。

  • int 和 double都是num的子類

num類型可進(jìn)行加基本的運(yùn)算,例如加減乘除特幔,更多運(yùn)算可以參考dart:math庫

整數(shù)是沒有小數(shù)點(diǎn)的數(shù)字咨演。 以下是定義整數(shù)的一些示例:

var x = 1;
var hex = 0xDEADBEEF; //十六進(jìn)制

如果數(shù)字包含小數(shù),則為雙精度數(shù):

var y = 1.1;
var exponents = 1.42e5;

從Dart 2.1開始蚯斯,必要時整數(shù)會自動轉(zhuǎn)換為雙精度數(shù):

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

以下是將字符串和數(shù)字互相轉(zhuǎn)換的示例:

  // 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

傳統(tǒng)位移操作:

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 編碼的饵较,可以使用單引號或者雙引號來創(chuàng)建字符串
  • 可以使用三個單引號或者雙引號創(chuàng)建多行字符串對象
  • 可以使用 r 前綴創(chuàng)建”原始raw”字符串。
  • 可以在字符串中使用表達(dá)式: ${expression},如果表達(dá)式是一個標(biāo)識符遭赂,可以省略 {}循诉,如果表達(dá)式的結(jié)果為一個對象,則 Dart 會調(diào)用對象的 toString() 函數(shù)來獲取一個字符串嵌牺。

創(chuàng)建字符串:

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字符串(原始字符串是比較特殊的字符串逆粹,在原始字符串中僻弹,字符“\” 不再表示轉(zhuǎn)義字符的含義):

var s = r'In a raw string, not even \n gets special treatment.';

//打印:
//In a raw string, not even \n gets special treatment.

表達(dá)式字符串:


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對象未初始化的默認(rèn)值是null:

bool bb;

if (bb == false){

  print('It\s false.');

} else{

  print('It\s true.');

}

//打印 -> 
//Its true.

因?yàn)閎b為null退敦,所以不等于false,因此這里打印null蚣抗。

Lists

也許幾乎每種編程語言中最常見的集合是數(shù)組或有序的對象組侈百。 在Dart中,數(shù)組是List對象钝域,因此大多數(shù)人只是將它們稱為List锭魔。
這是一個簡單的Dart列表:

var list = [1, 2, 3];

//打印 ->
//[1, 2, 3]

Dart中可以直接打印list包括list的元素,List也是對象织咧。java中直接打印list結(jié)果是地址值漠秋。

這里定義var list = [1, 2, 3]時,Dart推斷l(xiāng)ist的類型為List <int>手趣。 如果嘗試將非整數(shù)對象添加到此列表,則分析器或運(yùn)行時會引發(fā)錯誤绿渣。


lists.png

Dart中List的下標(biāo)索引和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)); //根據(jù)字符串長度排序
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)是沒有順序且不能重復(fù)的集合中符,所以不能通過索引去獲取值:

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是關(guān)聯(lián)鍵和值的對象档插,dart中可以通過以下方式創(chuàng)建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}

如果嘗試將錯誤類型的值添加到任一映射慢蜓,則分析器或運(yùn)行時會引發(fā)錯誤(這里gifts添加一個key為2value為what的數(shù)據(jù))


map.png

也可以使用Map構(gòu)造函數(shù)創(chuàng)建相同的對象:

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代碼點(diǎn)耘柱。
由于Dart字符串是UTF-16代碼單元的序列棍现,因此在字符串中表示32位Unicode值需要特殊語法。

我們知道士袄, 在Unicode字符集中的某個字符對應(yīng)的代碼值朴肺,稱作代碼點(diǎn)(Code Point)坚洽,用16進(jìn)制表示,通常加上U+前綴鞍盗,Dart中則為\u跳昼。比如,‘你’的代碼點(diǎn)是\u4f60敷存;‘好’的代碼點(diǎn)是\u597d。要指定多于或少于4個十六進(jìn)制數(shù)字觅闽,請將值放在大括號中涮俄, 例如,笑的表情符號(??)是\u {1f600}孕锄。

我們這里需要了解兩個概念:
代碼點(diǎn)(code point):是指編碼字符集中苞尝,字符所對應(yīng)的數(shù)字,占用一個 Unicode 編碼位的字符恼除。有效范圍從U+0000到U+10FFFF曼氛。其中U+0000到U+FFFF為基本字符,U+10000到U+10FFFF為增補(bǔ)字符徽级。

代碼單元(code unit):表示指定編碼格式編碼的數(shù)量聊浅,對于小于 U+FFFF 的字符來說,使用 UTF-16 編碼需要一個代碼點(diǎn)旷痕,大于 U+FFFF 的字符需要使用兩個代碼點(diǎn)來表示顽冶。

更多Unicode相關(guān)知識可自行百度强重。

以下示例說明了runes,16位代碼單元和32位代碼點(diǎn)之間的關(guān)系:

var clapping = '\u{1f44f}';  //創(chuàng)建一個使用UTF-16編碼的string
print(clapping);
print('string code unit: ${clapping.codeUnits}'); //兩個代碼單元
print('string code point: ${clapping.runes.toList()}'); //一個代碼點(diǎn)

Runes runes = new Runes('\u{1f44f}'); //創(chuàng)建一個使用UTF-32編碼的Runes
print('runes code point: ${runes.toList()}'); //一個代碼點(diǎn)

//打印-> 
//??
//string code unit: [55357, 56399]
//string code point: [128079]
//runes code point: [128079]

可以看到使用UTF-16編碼的clpping的代碼點(diǎn)和使用UTF-32編碼的Runes是一樣的佃声,那Runes到底作用是什么倘要?
Runes其實(shí)是一個用UTF-32進(jìn)行編碼的的String。

var sInput =  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}'; //使用UTF-16進(jìn)行編碼
Runes input = new Runes(
  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}'); //使用UTF-32進(jìn)行編碼

print(new String.fromCharCodes(input)); //UTF-32轉(zhuǎn)UTF-16的時候調(diào)用了fromCharCodes
print(sInput);

//打印 ->
//?  ??  ??  ??  ??  ??
//?  ??  ??  ??  ??  ??

方法源碼為:

external factory String.fromCharCodes(Iterable<int> charCodes,
      [int start = 0, int end]);

如果傳遞的charCodes為UTF-16的代碼單元志鹃,則逐字復(fù)制
如果傳遞的charCodes的值大于16位弄跌,則將其分解為代理項(xiàng)對:

var clef = new String.fromCharCodes([0x1D11E]); //大于 FFFF
clef.codeUnitAt(0); // 0xD834
clef.codeUnitAt(1); // 0xDD1E
Symbols

主要是反射用,現(xiàn)在mirrors模塊已經(jīng)被移除


Symbols.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埠胖,一起剝皮案震驚了整個濱河市直撤,隨后出現(xiàn)的幾起案子蜕着,更是在濱河造成了極大的恐慌,老刑警劉巖蓖乘,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件韧骗,死亡現(xiàn)場離奇詭異袍暴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)政模,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門淋样,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纽什,你說我怎么就攤上這事躲叼∑蟪玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵探孝,是天一觀的道長誉裆。 經(jīng)常有香客問我,道長粱腻,這世上最難降的妖魔是什么斩跌? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任耀鸦,我火速辦了婚禮,結(jié)果婚禮上袖订,老公的妹妹穿的比我還像新娘洛姑。我一直安慰自己,他們只是感情好吏口,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布产徊。 她就那樣靜靜地躺著,像睡著了一般戈盈。 火紅的嫁衣襯著肌膚如雪谆刨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天刁岸,我揣著相機(jī)與錄音虹曙,去河邊找鬼。 笑死酝碳,一個胖子當(dāng)著我的面吹牛疏哗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播返奉,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼衡瓶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了关面?” 一聲冷哼從身側(cè)響起十厢,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛮放,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞻想,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娩嚼,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贵少。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滔灶。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖随常,靈堂內(nèi)的尸體忽然破棺而出萄涯,到底是詐尸還是另有隱情,我是刑警寧澤枣察,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布燃逻,位于F島的核電站,受9級特大地震影響猿涨,放射性物質(zhì)發(fā)生泄漏姆怪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一俺附、第九天 我趴在偏房一處隱蔽的房頂上張望事镣。 院中可真熱鬧揪胃,春花似錦、人聲如沸沮稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盛杰。三九已至藐石,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逗嫡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工延窜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抹锄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓获高,卻偏偏與公主長得像念秧,于是被迫代替她去往敵國和親布疼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容