Dart基礎 — Variables
型別推斷
Dart 為一個強型別語言,與 Swift 相同都擁有「型別推斷」的功能。
String name = '王大明';
var varName = '王小明';print(name is String);
//trueprint(varName is String);
//true
dynamic
如果今天你希望一個 property 是一個動態型別的話,可以使用 dynamic 關鍵字。
dynamic value = '王小明';
print(value); //王小明value = 30;
print(value); //30value = false;
print(value); //false
常數 — final
當一個 property 被 final 宣告時,此 property 則不可再被指派新的值。
final String name = '我是一個不可變動的常數';name = '變變看'; // compile error
變數 — Variable
變數允許指派新的值給參數。
var name = '王小明';
print(name); //王小明name = '王大明';
print(name); //王大明
Optional
在寫程式的時候有時會遇到物件在初始時不需要初始值。
class Person{
String name;
int age;
Car? car;
Person(this.name, this.age, [this.car]); //建構子
}void main() {
Person billy = new Person('Billy',3);
print(billy.name); //billy
print(billy.car == null); //true
}
如上例,我有一個物件 Person
由於 Car 並非一個 Person 組成的必要物件,故我把它設定為 optional。
當某天我寫到需要使用 Person 內的 Car 時,我就可以先判斷 car == null 來判斷 Person 是否有 Car。
Late
這東西就跟 swift 的 lazy 87% 像。
實質上就是 parameter 在呼叫時才會初始化。
官方文件提到使用 late 這個關鍵字通常有兩種情境
- 還無法決定 property 的 value,但又要宣告這個 property 不是 null。
late String name;void main() {
name = '王小明';
print(name); //王小明
}
但通常我寧願給 name 一個空字串當作初始值,原因是這個寫法還是會需要指派一個值給 name,如果今天某個合作的工程師沒有注意到直接使用沒有初始值的 name 的話,程式會直接錯給你看。
通常我會使用的情境都是第二種。
2. property 的 value 是由一個 method 的返回值定義的
late String name = giveItAName();void main() {
print(name); //王小明
}String giveItANAme(){
return '王小明';
}
會在這種情境下使用最主要是為了程式的編譯效率,使用 late 可以分散 class 在初始時的負擔,若給予值的 method 會使用到多個 class 或是計算繁複的話,更應該使用 late。
還有一個常常拿來跟 final 來比較的 const 關鍵字,但由於這個 const 的特性以及存在實在太有趣了,所以我決定另外寫一篇來做紀錄。