本篇繼續介紹dart變量類型,可參考前文:第二篇:dart變量介紹 (一)
(一)final和const類型
如果你不打算修改一個變量的值,那么就把它定義為final或const類型。其中:final變量的值只能被設置一次,const變量是編譯時常量(const是隱式final)。final變量在第一次使用時初始化。(注:類實例變量可以是final類型,但不可以是const類型)
final類型的用法例子如下,在final關鍵字后,可選擇是否顯式聲明變量類型:
final name ='Bob'; final String nameS = 'Jack Ma';
通過上邊的基本用法我們可以看到:不同於C語言的const,dart的final既可以作為變量修飾詞,也可以作為變量類型使用。
當你試圖改變一個final類型的變量值時會發生什么?我們來試一下,對上例添加如下修改:
name = 'ma yun';
看,編譯器提示你出錯了!所以,final變量被初始化之后是不能修改其值的。
關於const類型,官方給的說明是“編譯時常量”,我目前理解也不是太深刻,直接舉個栗子吧:
var foo = const []; final bar = const []; const baz = [];
以上用法都是合法的,你還可以做如下操作,也是合法的,因為foo是var類型:
foo = [1,2,3];
但你不可以做下邊的操作,,因為baz是const類型的:
baz = [2,5,9];
下邊看一種const使用的特殊情況,大家自己體會體會吧:
//以下3行代碼合法 const a = 2; const b = 3; const c = a * b; //以下代碼編譯出錯,因為a是int而不是const類型的 int a = 2; const b = 3; const c = a * b; //以下兩行代碼合法,因為2當作const常量類型 const b = 3; const c = 2 * b;
(二)Built-in類型
Dart語言支持以下8種內建數據類型。
(1)Numbers類型
Dart的數字類型有兩種:int和double。int變量通常不超過64bit,這取決於運行平台。double是64bit雙精度浮點型。
int和double都是num的子類型,num類型包括一些基本的操作,如+-*/,(位操作符,如>>,是在int類里定義的),如果num或num子類型不能滿足你的需求,試試dart:math庫。
關於什么是整型數、什么是浮點數就不再舉例子了啊,另外浮點數支持科學表示法。int類型可根據需要自動轉換為double類型,如: double a = 1;
下邊舉例看看字符串和數字之間的轉換,這個我覺得通常挺有用的:
int i = int.parse('126'); //把字符串‘126’轉化為整數126 double db = double.parse("12.36"); //把字符串'12.36‘轉化為12.36 String str = i.toString(); //把整型數字126(變量i)轉化為字符串’126‘ //下邊一行語句把12.36轉化為字符串,小數點后保留1位,自動四舍五入 String pStr = db.toStringAsFixed(1);
int類型的變量可以進行位運算操作,如下,不再細述:
int a = 3<<1; int b = 2|3; int c = 8>>1;
(2)String類型
Dart的字符串是utf-16的序列。dart和python類似,可以使用雙引號,也可以使用單引號創建字符串。
下面看一個例子(完整,可編譯),這個栗子里邊包含了兩個很小、卻很關鍵的知識點:
main() { String s1 = 'Jack Ma'; String s2 = '$s1 is ma yun'; int i1 = 123456; String s3 = 'I have ${i1.toString()} yuan'; print(s2); print(s3); if('Jack Ma is ma yun' == s2) { print('***'); } }
上述代碼的運行結果是:
知識點:
1、你可以使用 ${expression} 將表達式的值嵌入到一個字符串中(如上例中s3變量),如果表達式只是一個標識符,則可以直接省略{}, 如上例中的s2變量;
2、可以使用 == 操作符比較兩個字符串是否相同。
下面再看一個例子:
main() { String s1 = 'Jack Ma'; String s2 = ' is '; String s3 = 'Ma yun'; String s4 = s1 +s2 +s3; String s5 = 'Jack Ma'' is ''Ma yun'; print(s5); }
上例運行的結果是
Amazing!!!我們看看s5是個什么變量,字符串,我們再看看它是怎么賦值的?我的天吶, 把 'Jack ma'、' is '和'Ma yun'三個字符串緊挨着放在一起,dart就能把他們合並成一個字符串變量。大家可以打印下s4觀察輸出。
知識點:
1、可以使用 + 操作符,將多個字符串進行拼接;
2、可以把相鄰的字符串放在一起,編譯器自動為你拼接;
3、可以使用三個引號(雙引號或單引號均可)創建跨行字符串(和Python類似);
4、可以通過前綴r來創建原始字符串(和Python類似,原始字符串不對轉義字符進行特殊處理,如 r'hh\n' 不會將\n處理為換行)。
(3)Booleans類型
Dart使用類型bool來表示boolean值,只有兩個對象是bool類型:true和false,這兩個都是編譯時常量。
bool類型比較簡單,官網唯一的提示就是 不能使用 if(非布爾值) 或 assert(非布爾值) 這樣的表達式。
(4)Lists類型
在Dart中,數組是列表對象。看下例子:
var list_a = [2,3,6];
//list_a[0] = 'string'; Error
以上程序,dart推斷list_a是 List<int> ,當你試圖添加一個非整型數據進去時,編譯器會報錯。
dart的數組像C語言一樣,下標從0開始,到length-1為止,其中,可以通過list.length獲取得數組的長度,如下:
main() { var list_a = const [2,3,6]; // 定義一個編譯時常量list print(list_a[0]); // 打印:2 print(list_a[2]); // 打印:6 print(list_a.length); // 打印:3 }
(5)Sets類型
Dart中的set是一系列無序項的集合。看一個簡單的例子:
var set_exam = {'set111', 'set222', 'set333'};
上例中,dart能夠推斷出set_exam是String類型的set,當你試圖追加非string類型的值時,會報錯。
當你想創建一個空的set時,需要在{}符號前添加set里變量的類型,或者使用set類型創建,如:
//創建一個set,其中可存放string類型的值 var names = <String>{}; 或者 Set<String> names = {}; //與上面的等價 //var names = {}; 這句話就不行了,這是創建了一個map,而不是set
向一個set中添加數據可使用add()或addAll()方法,如下例:
var set_1 = {'111', '222', '333'}; var set_2 = <String>{}; set_2.add('Add method'); set_2.addAll(set_1);
使用 length 屬性去獲取一個set里的元素個數,如:
var set_1 = {'111', '222', '333'}; var set_2 = <String>{}; set_2.add('Add method'); set_2.addAll(set_1); var set_num = set_2.length; print(set_num); //打印出的值為 4
創建一個const的set,可直接在{}前添加const修飾.
(6)Maps類型
Dart的map是一種key-value鍵對的類型,key和value均可以是任意值。一個key只能對應一個value,但是一個value卻可以有多個key。看一個map的簡單例子吧:
var map_1 = {'first':'111', 'second':'222', 'third':'333'}; var map_2 = {1:'111', 2:'111', 3:'333'};
上例中,dart推斷map_1是 Map<String,String> 類型,而map_2是 Map<int, String> 類型。同set一樣,在類型確定后,你不能再添加非此類型的鍵值對了。
也可以使用Map構造一個map變量:
var gifts = Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings';
向一個map變量中添加鍵值對:
var gifts = {'first': 'partridge'}; gifts['fourth'] = 'calling birds'; // Add a key-value
可以直接 String st=gifts['first']; 來獲取某個鍵對應的值,當這個鍵在map中不存在時,將返回null.
像set一樣,map也可以使用 .length 來獲取其中的鍵值對數,不再細述。
(7)Runes類型
Dart的rune類型主要是unicode編碼之類的,我還沒看太明白。。。
(8)Symbols類型
Dart的Symbol表示程序中出現的操作符或標識符,實際編程中沒啥接觸,不再細述。