Dart語(yǔ)言之?dāng)?shù)據(jù)類(lèi)型
數(shù)據(jù)類(lèi)型
- dart語(yǔ)言數(shù)據(jù)類(lèi)型包含一下類(lèi)型:
- 變量-Var
- 常量-Const
- 數(shù)值型-Number
- 字符串-String
- 布爾型-Boolean
- 列表-List
- 鍵值對(duì)-Map
- 動(dòng)態(tài)類(lèi)型-dynamic
- Runes、Symbols(很少用)
變量Var
使用var聲明變量,可賦予不同類(lèi)型的值
-
未初始化時(shí),默認(rèn)值為null。此時(shí)的類(lèi)型dynamic類(lèi)型
var a; //初始化并沒(méi)有聲明類(lèi)型,是dynamic類(lèi)型 print(a); //null a = 10; print(a); //10 a = 'hello world'; print(a); //hello world //聲明變量并初始化,確實(shí)變量類(lèi)型 var b = 20; print(b); //20 -
使用final聲明一個(gè)只能賦值一次的變量
//final變量 final c = 20; //類(lèi)型已經(jīng)確定并且不能再進(jìn)行賦值 c = 'hello';//報(bào)錯(cuò) c = 10; //報(bào)錯(cuò)
常量Const
使用const聲明常量
-
使用const聲明的必須是編譯器常量
const d = 20; d = 50;//報(bào)錯(cuò),常量不能再賦值了。
數(shù)值型num
Dart語(yǔ)言是面向?qū)ο笳Z(yǔ)言,num也是object,int和double繼承于num。
如果直接用int和double來(lái)聲明的話(huà),int無(wú)法變成double,double無(wú)法變成int
-
num包含兩種子類(lèi)型:1、整型-int 2、浮點(diǎn)型-double
num = 10;//整型 num = 10.5;//這個(gè)時(shí)候就變成浮點(diǎn)型了 int b = 20; b = 20.5;//報(bào)錯(cuò)int不能轉(zhuǎn)double double d = 20.5; d = 20; //報(bào)錯(cuò)double不能轉(zhuǎn)int -
運(yùn)算符:+、-、*、/、~/、%
int a = 10; int b = 2; print(a + b); //12 print(a - b); //8 print(a * b); //20 print(a / b); //5.0 這個(gè)不是整除,值是浮點(diǎn)型的 print(a ~/ b);//整除,余數(shù)部分舍棄取整 5 print(a % b);//去余數(shù) 0 -
常用屬性:isNaN、isEven、isOdd等
//isNaN 非數(shù)字 print(0.0/0.0);//NaN,只有這個(gè)情況是 int a = 3; int b = 4; //是否是偶數(shù) print(a.isEven);//false print(b.isEven);//true //是否是奇數(shù) print(a.isOdd);//true print(b.isOdd);//false -
常用的方法:abs()、round()、floor()、ceil()、toInt()、toDouble()
int a = -100; //取絕對(duì)值 print(a.abs()); //100 double f = 10.5; //四舍五入 print(f.round()); //11 //不大于f的最大整數(shù) print(f.floor()); //10 //不小于f的最小整數(shù) print(f.ceil()); //11 //轉(zhuǎn)整型 print(f.toInt()); //10 //轉(zhuǎn)浮點(diǎn)型 int d = 100; print(d.toDouble()); //100.0
字符串
-
使用單引號(hào)、雙引號(hào)創(chuàng)建的字符串
String str1 ='hello'; //使用雙引號(hào)也可以字符串賦值 -
使用三個(gè)單引號(hào)、三個(gè)雙引號(hào)創(chuàng)建的多行字符串
String str = '''hello dart''';//使用三個(gè)雙引號(hào)賦值多行字符串 -
使用r創(chuàng)建原始的raw字符串
String *str = 'hello \n Dart '; print(str);//打印換行字符串 //打印帶\n String *str1 = r'hello \n Dart '; print(str1);//hello \n Dart -
可以使用+號(hào)來(lái)拼接字符串
String *str1 = 'hello'; print(str1 + 'dart');//hellodart -
可以使用*號(hào)來(lái)表示循環(huán)這個(gè)字符串幾次
String *str1 = 'hello'; print(str1*3);//hellohellohello -
可以使用==比較兩個(gè)字符串是否相等(比較的是內(nèi)容)
String *str1 = 'hello'; String *str2 = 'hello'; String *str3 = 'dart'; print(str1 == str2); //true print(str1 == str3); //false -
可以使用[]來(lái)獲取字符串的某個(gè)字節(jié)
String *str1 = 'hello'; print(str1[0]); // h -
可以使用${表達(dá)式}來(lái)表示插值表達(dá)式
int a = 1; int b = 2; print("a + b = $(a + b)");//a + b = 3 print("a = $a");//a = 1 -
可以使用.length獲取字符串長(zhǎng)度(空格也算一個(gè)字節(jié))
String str = 'hello'; print(str.length);//5 String str = 'hello dart'; print(str.length);//10 -
可以使用.isEmpty、.isNotEmpty來(lái)判斷是空、是非空
String str = 'hello'; print(str.isEmpty); //false print(str.isNotEmpty); //true -
可以使用.contains(字符串)判斷是字符穿否包含另一個(gè)字符串
String str = 'hello dart'; print(str.contains('dart')); //true -
可以使用.substring(int startIndex, endIndex)來(lái)截取字符串
String str = 'hello dart'; print(str.substring(0,4)); // hello -
可以使用.startsWith(字符串)、.endsWith(字符串)來(lái)判斷是否以括號(hào)里字符串開(kāi)頭、結(jié)尾的
String str = 'hello dart'; print(str.startsWith('he')); //true print(str.endsWith('a')); // false -
可以使用.split()分割字符串,返回的是List
String str = 'hello dart'; //以空格分割 var list = str.split(' '); print(list); //[hello,dart] -
可以使用.replaceAll()來(lái)替換字符串
String str = 'hello dart'; print(str.replaceAll('dart','java')); //hello java -
可以使用.toLowerCase()、toUpperCase()轉(zhuǎn)成小寫(xiě)、大寫(xiě)
String str = 'Hello'; print(str.toLowerCase()); //hello print(str.toUpperCase()); //HELLO 字符串還有很多的方法,自己可以摸索。我只列出比較常用的方法
布爾型
- 使用bool表示布爾類(lèi)型
- 布爾值只有true和false
列表List
-
創(chuàng)建可變List
var list = [1,2,3]; -
創(chuàng)建一個(gè)不可變的List
//不可變,內(nèi)容元素和長(zhǎng)度都不可變 var list = const [1,2,3]; -
構(gòu)造創(chuàng)建
var list = new List(); -
列表里面的元素可以是不同類(lèi)型的
var list = [1,2,'dart',true]; print(list); //[1,2.dart,true] -
可以通過(guò).[imdex]獲取某個(gè)元素或者改變某個(gè)元素的值
var list = [1,2,'dart',true]; print(list[]); //dart list[1] = 8; print(list);//[1,8,dart,true] 可以通過(guò).length獲取list的長(zhǎng)度
var list = [1,2,'dart',true];
print(list.length); //4
-
可以同過(guò)add(element)、insert(index,element)添加元素,添加的元素類(lèi)型List要包含
var list = ['dart','java']; list.add('iOS'); list.add(3); //報(bào)錯(cuò),List都是字符串,沒(méi)有int類(lèi)型,要想添加成功List里面必須要int,還有一種dynamic方式創(chuàng)建就可以,后面會(huì)講 print(list);//[dart,java,iOS] list.insert(0,'data'); list.insert(0, 3); //報(bào)錯(cuò),List都是字符串,沒(méi)有int類(lèi)型 print(list); [data,dart,java,iOS] -
可以通過(guò)remove(element)移除元素、removeLast()移除最后一個(gè)元素、removeAt(idnex)按index移除元素、clear()清空元素
var list = [1,2,'dart',true]; list.remove(true) print(list); //[1,2,dart] list.removeLast(); print(list); //[1,2] list.removeAt(0); print(list); //[2] list.clear(); print(list); //[] -
可以通過(guò)indexOf(element)獲取元素所在的位置、lastIndexOf()最后元素所在的位置
var list = [1,2,'dart',true]; print(list.indexOf('dart')); //2 print(list.lastIndexOf());//3 可以通過(guò)sort()排序,排序的元素必須是同類(lèi)型的
-
sublist()獲取子list
var list = [1,2,'a']; list.sort(); print(list);//報(bào)錯(cuò),排序需要list的元素是同類(lèi)型的 var list1 = [2,4,1]; list.sort(); print(list); //[1,2,4] var list2 = ['hello','dart','java']; list2.sort(); print(list2); //[dart, hello, java] -
可以通過(guò)asMap()把list轉(zhuǎn)成Map(鍵值對(duì))key是用元素的index補(bǔ)全
var list2 = ['hello','dart']; print(list2.asMap()); //{0: dart, 1: hello} -
可以通過(guò)forEach(f)遍歷list的元素,括號(hào)里f是方法
var list2 = ['hello','dart','java']; //遍歷每個(gè)元素都都調(diào)用print list2.forEach(print); //hello //dart //java
可能有些人不太明白元素的值怎么傳遞的,可以看看forEach實(shí)現(xiàn)源碼
void forEach(void f(E element)) {
for (E element in this) f(element);
}
看到這大概知道了,就是遍歷this就是自己也就是list,把list里面的元素,遍歷的時(shí)候把元素當(dāng)成f這個(gè)方法的參數(shù)。
- List里面的方法太多,我只列舉比較常用的方法,大家有時(shí)間可以多了解其他的方法
Map 鍵值對(duì)
-
創(chuàng)建可變的Map
var map = {'first':'dart','second':'java'}; -
創(chuàng)建不可變的Map,map里的鍵值對(duì)都不能更改
var map = const {1:'dart',2:'java'}; -
構(gòu)造創(chuàng)建
var map = new Map(); -
可以通過(guò)[key]來(lái)獲取value,key盡量使用字符串或者數(shù)字,不要使用布爾值當(dāng)key。
var map = {'first':'dart',2:'java'}; print(map['first']); //dart print(map[2]); //java 可以通過(guò).addAll(Map<K, V> other)來(lái)添加鍵值對(duì)
-
可以通過(guò).length獲取map的鍵值對(duì)個(gè)數(shù)
var map = {'first':'dart',2:'java'}; map.addAll({'third':'iOS'}); print(map); //{'first':'dart',2:'java','third':'iOS'} -
可以通過(guò).isEmpty()是否是空不 .isNotEmpty()是否是非空
var map = {'first':'dart',2:'java'}; print(map.isEmpty()); //false print(map.isNotEmpty()); //true -
可以通過(guò).keys、.values獲取Map所有的鍵、值
var map = {'first':'dart',2:'java'}; print(map.keys); //(first,2) print(map.values); //(dart,java) -
可以通過(guò)containsKey()、containsValue()來(lái)判斷是否包含某個(gè)key、value
var map = {'first':'dart',2:'java'}; print(map.containsKey('first')); //true print(map.containsValue('iOS')); //false -
可以通過(guò)remove()移除某個(gè)key的鍵值對(duì)
var map = {'first':'dart',2:'java'}; map.remove('first'); print(map);// {2:'java'} -
通過(guò)forEach(f)遍歷所有的鍵值對(duì)
//forEach(f) f這個(gè)方法接受兩個(gè)參數(shù)key、value void forEach(void f(K key, V value)); var map = {'first':'dart',2:'java'}; map.forEach(f); /* key=first,value=dart key=2,value=java */ //下面是定義一個(gè)方法接受兩個(gè)參數(shù)的處理 void f(key, value) { print('key=$key,value=$value'); } Map里面的方法太多,我只列舉比較常用的方法,大家有時(shí)間可以多了解其他的方法
dynamic
Dart提供了可選的類(lèi)型系統(tǒng),在聲明變量、定義函數(shù)的時(shí)候,可以指定類(lèi)型,也可以不指定,不指定的話(huà)就是dynamic
-
Dart的類(lèi)型系統(tǒng)比較獨(dú)特的地方在于,類(lèi)型僅僅是給編輯器看的,它不應(yīng)也不會(huì)對(duì)代碼的行為產(chǎn)生任何影響。在production模式下,類(lèi)型會(huì)被忽略,以獲得更好的性能。我們?cè)趫?zhí)行dart代碼時(shí),可以指定–checked參數(shù),打開(kāi)或關(guān)閉運(yùn)行時(shí)的類(lèi)型檢查(默認(rèn)未開(kāi)啟)。
var a = 10; //指定類(lèi)型并且賦值 a = 'aa'; //報(bào)錯(cuò),不是int類(lèi)型 var a; //a沒(méi)有指定類(lèi)型是dynamic,可以賦值任何類(lèi)型 a = 10; //dynamic a = 'dart; //dynamic -
可以通過(guò)dynamic 聲明一個(gè)變量
dynamic b = 10; b = 'dart'; //因?yàn)槭莿?dòng)態(tài)類(lèi)型可以賦值字符串 -
可以創(chuàng)建dynamic的List
//通過(guò)dynamic創(chuàng)建的list可以添加任何類(lèi)型 var list = new List<dynamic>(); list.add(1); list.add("value"); list.add(true); print(list); //[1,value,true]
Runes
在DART中,runes表示字符串的UTF-32編碼
Unicode為所有世界上的書(shū)寫(xiě)系統(tǒng)中使用的每個(gè)字母、數(shù)字和符號(hào)定義一個(gè)唯一的數(shù)字值。由于DART字符串是由UTF-16代碼單元組成的序列,因此在字符串中表示32位Unicode值需要特殊的語(yǔ)法。
通常表示Unicode代碼點(diǎn)的方法是uXXXX,其中XXXX是一個(gè)4位的十六進(jìn)制值。例如,愛(ài)心字符(?)是u2665。
-
String類(lèi)具有幾個(gè)可用于提取符文信息的屬性,codeUnitAt和codeUnit屬性返回16位代碼單元。使用runes屬性獲取字符串的符文。
var clapping = '\u{1f44f}'; print(clapping); print(clapping.codeUnits); print(clapping.runes.toList()); Runes input = new Runes( '\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}'); print(new String.fromCharCodes(input));
打印的結(jié)果如下:

Symbol
-
Symbol對(duì)象表示在Dart程序中聲明的運(yùn)算符或標(biāo)識(shí)符。您可能永遠(yuǎn)不需要使用符號(hào),但它們對(duì)于按名稱(chēng)引用標(biāo)識(shí)符的API非常有用,因?yàn)榭s小會(huì)更改標(biāo)識(shí)符名稱(chēng)而不會(huì)更改標(biāo)識(shí)符符號(hào)。要獲取標(biāo)識(shí)符的符號(hào),請(qǐng)使用符號(hào)文字,它只是#后跟標(biāo)識(shí)符:
// 通過(guò)new Symbol()聲明 var a = new Symbol('radix'); print(a); //Symbol("radix") //可以通過(guò)#radix來(lái)表示 print(#radix); //Symbol("radix") print(#bar); //Symbol("bar") print(#radix == new Symbol('radix')); //true
這個(gè)很不常用,大家知道這個(gè)類(lèi)型就可以。