Dart語言與其他語言究竟有什麼不同呢?在已有的程式語言經驗的基礎上,我們該如何快速上手呢?本篇文章從程式語言中最重要的組成部分,也就是基礎語法與型別變數出發,一起來學習Dart吧
一、Dart語言之初體驗
Dart可以在編譯器(Android Studio)、命令列(前提是安裝了Dart SDK)及網頁repl.it中除錯編譯,由於本次內容比較簡單,我們直接在網頁中除錯編譯即可。
我們定義一個輸出當前時間的函式,並輸出當前時間
//輸出當前時間
void nowTime() {
int year = DateTime.now().year;
int month = DateTime.now().month;
int day = DateTime.now().day;
int hour = DateTime.now().hour;
int minute = DateTime.now().minute;
int second = DateTime.now().second;
String str = 'Hello World, This is $year-$month-$day $hour:$minute:$second';
print(str);
}
複製程式碼
和絕大多數其他語言一樣,Dart要求以main函式作為執行的入口,我們再定義main函式,並將輸出當時時間的函式放入main函式中
void main() {
nowTime();
}
複製程式碼
點選“run”按鈕,命令就會輸出
Hello World, This is 2019-8-11 10:45:46
複製程式碼
我們已經可以簡單的執行Dart程式碼了,我們接下來再看一下Dart的基本變數型別
二、Dart的變數與型別
在Dart中,所有的變數都可以用var來申明,當然,也可以指定具體的型別來申明一個變數。當使用var申明變數時,表示型別是交由編譯器推斷決定的。雖然Dart支援用var來申明變數,但我還是建議使用具體的型別來申明變數,這樣編輯器和編譯器就能使用這些具體的型別,向你提供程式碼補全或編譯告警的提示了。
注意:在預設情況下,所有未初始化的變數值都是null,因此,我們判斷變數是否初始化時只用和null比較即可。
Dart是型別安全的語言,並且所有型別都是物件型別,都繼承自頂層型別Object,因此一切變數的值都是累的例項(即物件),其中包括數字、布林值、函式和null也都是繼承自Object物件。
Dart內建了一些基本型別,如num、bool、String、List及Map。
num、bool及String
num、bool及String基本上是程式語言中最常用的型別
Dart的數值型別num只有兩種子類:int(整數型別)和double(浮點型別)
void numVerb() {
int x = 100;
double y = 5.2;
double xy=x*y;
int roundY = xy.round();
print('x = $x, y = $y, xy = $xy, roundY = $roundY');
}
複製程式碼
x = 100, y = 5.2, xy = 520.0, roundY = 520
複製程式碼
除了常見的基本運算子(比如:+、-、*、/,以及位運算子)外,還能使用繼承自num的abs()、round()等方法來實現求絕對值、取整等功能。
Dart的布林型別bool也只有兩種取值:true和false,他們都是編譯時常量。 Dart是型別安全的,因此我們需要顯示的檢查值
void checkValue() {
bool isTrue = true;
assert(isTrue == true);
//assert(isTrue);//錯誤
}
複製程式碼
Dart的String由UTF-16de字串組成,定義字串時我們既能使用單引號也能使用雙引號,並且還能在字串中嵌入變數或表示式(可以使用${express}把一個表示式的值放進字串,而如果是一個識別符號,則可以省略{})。
/**
* 將一個字串中的字母全部轉換為大寫
*/
void upperCase() {
String str = 'toUpperCase';
String str2 = "toUpperCase";
String str3 = 'str = $str, str2 = $str2, str to upperCase: ${str.toUpperCase()}';
print(str3);
}
複製程式碼
str = toUpperCase, str2 = toUpperCase, str to upperCase: TOUPPERCASE
複製程式碼
為了獲得內嵌物件的字串,Dart會呼叫物件的toString()方法,而常見字串的拼接,Dart則通過內建運算子“+”實現。
void stringVerb() {
int year = DateTime.now().year;
int month = DateTime.now().month;
int day = DateTime.now().day;
int hour = DateTime.now().hour;
int minute = DateTime.now().minute;
int second = DateTime.now().second;
String str = 'Hello World, This is ' +
year.toString() +
'-' +
month.toString() +
'-' +
day.toString() +
' ' +
hour.toString() +
':' +
minute.toString() +
':' +
second.toString();
print(str);
}
複製程式碼
Hello World, This is 2019-8-11 12:19:31
複製程式碼
對於多行字串對的構建,你可以通過三個單引號或三個雙引號的方式申明
void stringVerb() {
int year = DateTime.now().year;
int month = DateTime.now().month;
int day = DateTime.now().day;
int hour = DateTime.now().hour;
int minute = DateTime.now().minute;
int second = DateTime.now().second;
String str = """Hello World, This is
$year-$month-$day $hour:$minute:$second""";
print(str);
String str2 = '''Hello World, This is
$year-$month-$day $hour:$minute:$second''';
print(str2);
}
複製程式碼
Hello World, This is
2019-8-11 12:32:5
Hello World, This is
2019-8-11 12:32:5
複製程式碼
List和Map
List和Map分別對應其他程式語言中的陣列和字典型別,統稱為集合型別
void listTest() {
List<String> arr1 = ['name', 'age', 'sex'];
for (var value in arr1) {
print(value);
}
List<int> aar2 = List.of([1, 2, 3]);
aar2.add(4);
for (var value2 in aar2) {
print(value2);
}
List<num> nums = new List<num>();
nums.add(1);
nums.add(1.1);
nums.add(3);
nums.add(5.20);
for (var value3 in nums) {
print(value3);
}
}
複製程式碼
name
age
sex
1
2
3
4
1
1.1
3
5.2
複製程式碼
如上程式碼所示,我們申明並初始化了三個List變數,並呼叫其各自的迭代方法依次列印出其內部元素
void mapTest() {
Map<String, String> map = {'name': 'Jack', 'age': '18', 'sex': '男'};
map['name'] = 'Tom';
map['age'] = '20';
map['sex'] = '男';
map.forEach((k, v) => print('$k:$v'));
Map map2=new Map<String,String>();
map2['name']='Dart';
map2['age']='2';
map2.forEach((k,v)=>print('$k:$v'));
}
複製程式碼
name:Tom
age:20
sex:男
name:Dart
age:2
複製程式碼
如上程式碼所示,我們申明並初始化了兩個Map變數,同樣呼叫其各自的迭代方法依次列印出其內部的元素
定義常量
如果你想定義不可變的變數,則需要在定義前加上final或const關鍵字
const:表示變數在編譯期間既能確定的值
final:表示變數可以在執行時確定值,但一旦確定後就不可改變
const與final區別:在定義const常量時,必須直接賦值,且只能是一個固定值,不能為一個變數或公式;在定義final常量時,可以賦值也可以不賦值,賦值時可以賦值為一個固定值,也可以賦值為一個變數或公式,但一旦賦值後就不能再改變
已同步更新至微信公眾號,歡迎關注“Android小白營”