Flutter學習之Dart基礎資料型別
簡介
既然 Dart 是一門語言,那麼就和我們所知道語言一樣,有基本的資料型別以及常見的流程處理語法,那麼我們就來了解下。
Dart 的所有東西都是物件,包括數字,函式等。它們都繼承自 Object ,預設是都是 null(包括數字),所以數字,字串都可以呼叫各種方法。
常亮與變數
變數
使用 var 宣告變數,可賦予不同型別的值;未初始化時,預設值為 null ;使用 final 宣告一個只能賦值一次的變數
void main(){
// 宣告一個變數 a
var a;
print(a); // 列印 a 的值,顯示為 null
a = 10;
print(a); // 打印出來的結果為 10
a = "測試字串";
print(a); // 打印出來的結果為 測試字串
a = 30;
print(a); // 打印出來的結果為 30
final b = 10;
b = 20; // 這個會報錯,有提示: [dart] 'b', a final variable, can only be set once.
}
常量
在 dart 中使用 const 宣告常量;使用 const 宣告的必須是編譯期常量。
void main(){
const a = 10;
a = 20; // 這裡也會報錯:[dart] Constant variables can't be assigned a value.
}
在上面我們可以看到 dart 的一些簡單的語法。其實和 js 蠻像,宣告的變數的資料型別是隨便去改變的,沒有一個固定的資料型別(例如:java 這種語言)。其次就是 final 和 const 都可以宣告變數,並且聲明瞭變數之後都不能修改。
這裡簡單的說下 final 與 const 的區別:
final 要求變數只能初始化一次,並不要求賦的值一定是編譯時常量,可以是常量也可以不是。而 const 要求在宣告時初始化,並且賦值必需為編譯時常量。
Dart中的內建型別
在Dart 有幾種內建的資料型別:數值型-Number、布林型-boolean、鍵值對-Map、字串-String、列表-List、其他型別-Runes、Symbols
數值型
Dart 中只提供了兩種型別:
void main(){
num a = 10; // 整形
a = 20.1; // 浮點型
int i = 10;
i = 10.1; // 這個地方會報錯,因為將 int 型的資料改為 double 型
double d = 20.1;
d = 20; // 這個地方會報錯,因為將 double 型的資料改為 int 型
}
從上面可以看到如果是使用 num 宣告的變數,可以隨意的轉換型別,但是如果是使用了int 或者 double 明確的宣告,那麼就不能轉換了
數值型的操作
數值型的操作
運算子: +、 - 、* 、/ 、 ~/ 、 %
常用屬性: isNaN、isEven、isOdd
常用方法:abs()、round()、floorl()、ceil()、toInt()、toDouble()
// 由於常用的方法在其他語言中都有,就不過去的贅述,下面列出一些特殊的
void main(){
int i = 10;
double d = 20.1;
print(i/d); // 0.49751243781094523
print(i~/d); // 0 這個操作是取整
print( i.isOdd ); // 判斷是奇數
print( i.isEven ); // 判斷是偶數
}
一些常見的轉換
// String -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
字串
在 dart 中居然可以使用 單引號 和 雙引號宣告字串。這兩種方式都可以。
void main(){
String string = '單引號宣告字串';
String string1 = "雙引號宣告字串";
}
在 String 中單、雙引號互相巢狀的情況
void main(){
String str = '單引號中的"雙引號"';
String str1 = "雙引號中的'單引號'";
print(str);
print(str1);
String str2 = '單引號中的 \'單引號\' ';
String str3 = "雙引號中的 \"雙引號\" ";
print(str2);
print(str3);
}
字串拼接的方式
下面列出 dart 中拼接字串的各種騷操作(黑魔法)。
void main(){
// 使用的是空格拼接,多個空格也可以
String str1 = '單引號空格字串' '拼接' '~'; // 單引號字串空格拼接~
// 使用換行符以及空格
String str2 = '單引號符串'
'換行了' '再加空格' '拼接'; // 單引號符串換行了再加空格拼接
// 單雙引號 空格拼接
String str3 = "單雙引號空格字串" '拼接' "~"; // 單雙引號字串空格拼接~
// 單雙引號 換行符以及空格
String str4 = "單雙引號符串"
'換行了' '再加空格' '拼接'; // 單雙引號符串換行了再加空格拼接
String str5 = '''
使用3個單引號、
看到我使用了麼
''';
String str6 = """
使用3個雙引號、
看到我使用了麼
""";
String str7 = "算了,還是正常一點" + ",使用 + 來拼接";
}
從上面可以看到 dart 中可以使用空格
來做為拼接。所以我們繼續研究下。
void main(){
// 拼接字串, 輸出:單引號空格 或者 雙引號空格
String blockStr = '單引號''空格';
String blockStr1 = '單引號' '空格';
String blockStr2 = "雙引號""空格";
String blockStr3 = "雙引號" "空格";
// 下面這兩種情況會報錯
// String blockStr4 = '單引號''''空格';
// String blockStr5 = "雙引號""""空格";
// 測試中間新增字元
String blockStr6 = '單引號''_''空格'; // 輸出:單引號_空格
String blockStr7 = "雙引號""#""空格"; // 注意不能使用 $,$會報錯, 輸出:單引號#空格
// 單雙引號混合使用
String blockStr8 = '單""""引號'; // 輸出:單""""引號
String blockStr9 = '單""_""引號'; // 輸出:單""_""引號
// 單雙引號混合使用
String blockStr10 = "雙''''引號"; // 輸出:雙''''引號
String blockStr11 = "雙''_''引號"; // 輸出:雙''_''引號
}
${表示式}的使用
類似於JS中 ES6 上面的表示式的使用,感覺是相通的。
void main(){
var flag = false;
var str = "測試字串";
print("我們來驗證字串:${str}" "然後看看我們的 flag:${flag}");
// 最後輸出的結果為:我們來驗證字串:測試字串然後看看我們的 flag:false
}
布林值
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);
List列表
例項化 List 的方法如下
void main(){
// 使用構造建立
var list = new List();
//建立一個int型別的list
List intlist = [1, 2, 3];
// 建立一個常量List, 不可以改變的List
List constList = const[10, 7, 23];
}
dart 中陣列常用的方法
void main(){
// 在陣列中可以存放多個不同型別的物件
var list = [1, 2, 3, 'Flutter', true];
print(list); // 輸出的結果:[1, 2, 3, Flutter, true]
// 修改陣列下標為2 的值
list[2] = 'Dart';
print(list); // 輸出的結果:[1, 2, Dart, Flutter, true]
// 獲取陣列的長度
print(list.length); // 輸出的結果:5
// 向陣列中新增元素
list.add("value");
print(list); // 輸出的結果:[1, 2, Dart, Flutter, true, value]
// 向陣列中的指定位置新增元素
list.insert(1, 'element');
print(list); // 輸出的結果:[1, element, 2, Dart, Flutter, true, value]
// 移除陣列中的元素
list.remove("value");
print(list); // 輸出的結果:[1, element, 2, Dart, Flutter, true]
// 移除陣列中指定的元素
list.removeAt(1);
print(list); // 輸出的結果:[1, 2, Dart, Flutter, true]
// 判斷陣列中是否有某個元素
print(list.indexOf("element")); // 輸出結果:-1
// 可以使用 sort() 函式來排序, 但是由於我們使用定義的陣列型別不一樣,就不能使用
var intlist = [1, 2, 5, 6 ,3];
// 根據語法提示: List.sort([(int, int) → int compare]) → void
intlist.sort( (a, b) => a.compareTo(b) );
print(intlist); // 輸出結果:[1, 2, 3, 5, 6]
}
map 集合
建立 Map 集合
void main(){
// 建立Map
var language = {'fisrt': 'dart', 'second': 'java'};
// 建立不可變的 Map
var constLanguage = const {'fisrt': 'dart', 'second': 'java'};
// 通過構造器建立
var initLanguage = new Map();
}
Map 中常用的方法
void main(){
// 建立Map
var map = {'fisrt': 'dart', 'second': 'java'};
// 獲取長度
print(map.length); // 輸出結果:2
// 判斷是否為空
print(map.isEmpty); // 輸出結果:false
print(map.isNotEmpty); // 輸出結果:true
// 獲取到所有的 key
print(map.keys); // 輸出結果:(fisrt, second)
// 獲取到所有的 values
print(map.values); // 輸出結果:(dart, java)
// 判斷是否包含某個key
print(map.containsKey("key")); // 輸出結果:false
// 判斷是否包含某個value
print(map.containsValue("key")); // 輸出結果:false
// 新增一個新的元素進去
map['third'] = 'key';
print(map); // 輸出結果:{fisrt: dart, second: java, third: key}
// 迴圈列印 程式碼提示:Map.forEach((String, String) → void f) → void
map.forEach( (key, value) => getMap(key, value) );
}
void getMap(key, value){
print("key:${key}, value:${value}");
}
dynamic 關鍵字
這個關鍵字就類似定義我們在 JS 中定義變數的情況。先看下面的程式碼
void main(){
// a 的資料型別可以隨意改變,這種型別就是 dynamic
var a ;
a = 10;
a = "dart";
// 這裡我們使用 dynamic 宣告
dynamic d = 10;
d = 'dart';
}
我們在 JS 中,定義變數的時候使用 var param = value
,通過這樣子的賦值,可以給 param
賦值任意型別的值,就是沒有固定的資料型別(在java 中是有固定的資料型別),然後在 dart 中,就定義了這種寫法。動態的資料型別為 dynamic。