Dart基礎 — Variables

ChunYi LI
One Two Swift
Published in
4 min readNov 1, 2021

型別推斷

Dart 為一個強型別語言,與 Swift 相同都擁有「型別推斷」的功能。

String name = '王大明';
var varName = '王小明';
print(name is String);
//true
print(varName is String);
//true

dynamic

如果今天你希望一個 property 是一個動態型別的話,可以使用 dynamic 關鍵字。

dynamic value = '王小明';
print(value); //王小明
value = 30;
print(value); //30
value = 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 這個關鍵字通常有兩種情境

  1. 還無法決定 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 的特性以及存在實在太有趣了,所以我決定另外寫一篇來做紀錄。

--

--

ChunYi LI
One Two Swift

Hi this is Chunyi-Li from Taiwan, a junior iOS deveoper