### 數據類型
1. ***num***
* ***num***是數字類型的父類,有兩個子類 int 和 double。
* ***int***根據平臺的不同,整數值不大于64位。在Dart VM上,值可以從-263到263 - 1,編譯成JavaScript的Dart使用JavaScript代碼,允許值從-253到253 - 1。
* ***double***64位(雙精度)浮點數,如IEEE 754標準所規定。
~~~
int a = 1;
print(a);
double b = 1.12;
print(b);
// String -> int
int one = int.parse('1');
// 輸出3
print(one + 2);
// String -> double
var onePointOne = double.parse('1.1');
// 輸出3.1
print(onePointOne + 2);
// int -> String
String oneAsString = 1.toString();
// The argument type 'int' can't be assigned to the parameter type 'String'
//print(oneAsString + 2);
// 輸出 1 + 2
print('$oneAsString + 2');
// 輸出 1 2
print('$oneAsString 2');
// double -> String 注意括號中要有小數點位數,否則報錯
String piAsString = 3.14159.toStringAsFixed(2);
// 截取兩位小數, 輸出3.14
print(piAsString);
String aString = 1.12618.toStringAsFixed(2);
// 檢查是否四舍五入,輸出1.13,發現會做四舍五入
print(aString);
~~~
2. ***String***
* Dart里面的String是一系列 UTF-16 代碼單元。
* 您可以使用單引號或雙引號來創建一個字符串。
* 單引號或者雙引號里面嵌套使用引號。
* 用或{} 來計算字符串中變量的值,***需要注意的是如果是表達式需要${表達式}***
~~~
String singleString = 'abcdddd';
String doubleString = "abcsdfafd";
String sdString = '$singleString a "bcsd" ${singleString}';
String dsString = "abc 'aaa' $sdString";
print(sdString);
print(dsString);
String singleString = 'aaa';
String doubleString = "bbb";
// 單引號嵌套雙引號
String sdString = '$singleString a "bbb" ${doubleString}';
// 輸出 aaa a "bbb" bbb
print(sdString);
// 雙引號嵌套單引號
String dsString = "${singleString.toUpperCase()} abc 'aaa' $doubleString.toUpperCase()";
// 輸出 AAA abc 'aaa' bbb.toUpperCase(),
可以看出 ”$doubleString.toUpperCase()“ 沒有加“{}“,導致輸出結果是”bbb.toUpperCase()“
print(dsString);
~~~
3. ***bool***
* Dart 是強 bool 類型檢查,只有bool 類型的值是true 才被認為是true。
* 只有兩個對象具有bool類型:true和false,它們都是編譯時常量。
* Dart的類型安全意味著您不能使用***if(nonbooleanValue)***或***assert(nonbooleanValue)***等代碼, 相反Dart使用的是顯式的檢查值。
* assert 是語言內置的斷言函數,僅在檢查模式下有效
在開發過程中, 除非條件為真,否則會引發異常。(斷言失敗則程序立刻終止)。
~~~
// 檢查是否為空字符串
var fullName = '';
assert(fullName.isEmpty);
// 檢查0
var hitPoints = 0;
assert(hitPoints <= 0);
// 檢查是否為null
var unicorn;
assert(unicorn == null);
// 檢查是否為NaN
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
~~~
4. ***List集合***
* 在Dart中,數組是List對象,因此大多數人只是將它們稱為List。
Dart list文字看起來像JavaScript數組文字
~~~
//創建一個int類型的list
List list = [10, 7, 23];
// 輸出[10, 7, 23]
print(list);
// 使用List的構造函數,也可以添加int參數,表示List固定長度,不能進行添加 刪除操作
var fruits = new List();
// 添加元素
fruits.add('apples');
// 添加多個元素
fruits.addAll(['oranges', 'bananas']);
List subFruits = ['apples', 'oranges', 'banans'];
// 添加多個元素
fruits.addAll(subFruits);
// 輸出: [apples, oranges, bananas, apples, oranges, banans]
print(fruits);
// 獲取List的長度
print(fruits.length);
// 獲取第一個元素
print(fruits.first);
// 獲取元素最后一個元素
print(fruits.last);
// 利用索引獲取元素
print(fruits[0]);
// 查找某個元素的索引號
print(fruits.indexOf('apples'));
// 刪除指定位置的元素,返回刪除的元素
print(fruits.removeAt(0));
// 刪除指定元素,成功返回true,失敗返回false
// 如果集合里面有多個“apples”, 只會刪除集合中第一個改元素
fruits.remove('apples');
// 刪除最后一個元素,返回刪除的元素
fruits.removeLast();
// 刪除指定范圍(索引)元素,含頭不含尾
fruits.removeRange(start,end);
// 刪除指定條件的元素(這里是元素長度大于6)
fruits.removeWhere((item) => item.length >6);
// 刪除所有的元素
fruits.clear();
~~~
* 注意事項:
1. 可以直接打印list包括list的元素,list也是一個對象。但是java必須遍歷才能打印list,直接打印是地址值。
2. 和java一樣list里面的元素必須保持類型一致,不一致就會報錯。
3. 和java一樣list的角標從0開始。
4. 如果集合里面有多個相同的元素“X”, 只會刪除集合中第一個改元素
5. ***Map集合***
* 一般來說,map是將鍵和值相關聯的對象。鍵和值都可以是任何類型的對象。
每個鍵只出現一次,但您可以多次使用相同的值。Dart支持map由map文字和map類型提供。
* 初始化Map方式一: 直接聲明,用{}表示,里面寫key和value,每組鍵值對中間用逗號隔開。
~~~
// Two keys in a map literal can't be equal.
// Map companys = {'Alibaba': '阿里巴巴', 'Tencent': '騰訊', 'baidu': '百度', 'Alibaba': '釘釘', 'Tenect': 'qq-music'};
Map companys = {'Alibaba': '阿里巴巴', 'Tencent': '騰訊', 'baidu': '百度'};
// 輸出:{Alibaba: 阿里巴巴, Tencent: 騰訊, baidu: 百度}
print(companys);
~~~
* 創建Map方式二:先聲明,再去賦值。
~~~
Map schoolsMap = new Map();
schoolsMap['first'] = '清華';
schoolsMap['second'] = '北大';
schoolsMap['third'] = '復旦';
// 打印結果 {first: 清華, second: 北大, third: 復旦}
print(schoolsMap);
var fruits = new Map();
fruits["first"] = "apple";
fruits["second"] = "banana";
fruits["fifth"] = "orange";
//換成雙引號,換成var 打印結果 {first: apple, second: banana, fifth: orange}
print(fruits);
~~~
* Map API
~~~
// 指定鍵值對的參數類型
var aMap = new Map<int, String>();
// Map的賦值,中括號中是Key,這里可不是數組
aMap[1] = '小米';
//Map中的鍵值對是唯一的
//同Set不同,第二次輸入的Key如果存在,Value會覆蓋之前的數據
aMap[1] = 'alibaba';
// map里面的value可以相同
aMap[2] = 'alibaba';
// map里面value可以為空字符串
aMap[3] = '';
// map里面的value可以為null
aMap[4] = null;
print(aMap);
// 檢索Map是否含有某Key
assert(aMap.containsKey(1));
//刪除某個鍵值對
aMap.remove(1);
print(aMap);
~~~
* 注意事項
1. map的key類型不一致也不會報錯。
2. 添加元素的時候,會按照你添加元素的順序逐個加入到map里面,哪怕你的key,比如分別是 1,2,4,看起來有間隔,事實上添加到map的時候是{1:value,2:value,4:value} 這種形式。
3. map里面的key不能相同。但是value可以相同,value可以為空字符串或者為null。