[dart學習]第三篇:dart變量介紹 (二)


 本篇繼續介紹dart變量類型,可參考前文:第二篇:dart變量介紹 (一)

 

(一)finalconst類型

如果你不打算修改一個變量的值,那么就把它定義為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表示程序中出現的操作符或標識符,實際編程中沒啥接觸,不再細述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM