iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 2
0

如何定義一個變數呢?在 Dart 中,我們可以使用 var 關鍵字來作為變數的類型。

若未指定數值,此時變數為 null。

var item;
if(item == null){
	print('item is null');
}

// item is null

類型推斷 (Inferred Type)

定義變數時,利用等號指定數值給該變數,Dart 編譯器會根據等號後面的數值推斷類型 。

var item = 'This is a String';
print(item.runtimeType);

// String

在定義變數時,若已指定數值,那麼該變數已經存有類型,之後再指定其他類型是不允許的,IDE 會在編譯時出現警告。

如下方的範例:

變數 item 指定一個 String 字串,編譯器 item 推斷類型為 String,若另指定一個整數給變數 item ,則是不被允許的。
Incorrect String

除了使用 var 定義變數,我們也可以明確的宣告變數類型。

String item = 'This is a String';

同樣的,如果定義變數時同時宣告類型,這個情況之下,也無法再指定其他類型的數值給這個變數。

String name = 'Andy';
name = 5; // Compilation-Error

dynamic / Object

定義變數的時候,也可以將變數定義 dynamic 或是 Object。其中,dynamic 是關鍵字,Object 是類型。

當變數使用關鍵字 dynamic 及 類型 Object 時,表示可以指定任何類型的數值給該變數。

如下面範例:

dynamic dynamicItem;
dynamicItem = 1; // OK
dynamicItem = 'Dynamic Item'; //OK

Object objectItem;
objectItem = 2; // OK
objectItem = 'Object Item';

dynamic 與 Object 有什麼差別呢?

dynamic dynamicItem = 'Dynamic Item';
print(dynamicItem.length); // 12

Object objectItem = 'Object Item';
print(objectItem.length); // Compilation-Error

發現什麼?

  • 關鍵字 dynamic 表示該變數可以使用任意的類型;當指定數值之後,Dart 編譯器會做類型推斷,該變數成為該類型,如上例為 String。
  • 類型 Object 是所有類型的父類別,也就是說它並不能使用子類別的方法。如上例,變數的類型指定為 Object ,所有等號右邊的數值都會以 Object 儲存,所以 String 的 length 就無法使用。

關鍵字 dynamic 會用在泛型的應用上,我們在之後的文章會再多做介紹。


final 以及 const

前面所介紹的關鍵字所定義的變數,都是可以被修改的,如果需要定義一個不可變的變數呢?

使用 final 以及 const 關鍵字,可以將變數定義成不可變的。

final

用 final 宣告變數,表示這個變數在指定數值之後,就不可以改變其值。

如同 var ,final 同樣也有類型推斷的能力,如下例:

final finalItem = 'final item';
finalItem = 'New final item'; //Compilation-error

也可以在關鍵字 final 後面加上類型,如此在等號後面的值就必須為該類型才允許存入。

final String finalString = 'final string';
final String finalString2 = 1; //Compilation-error

用關鍵字 final 宣告變數,必須在宣告時就指定數值,否則 IDE 將會編譯錯誤。

final emptyItem; //Compilation-error

const

const 是 compile-time 常數,意指這個數值是恆久不變的。

const maxValue = 1000;

如果需要在 class 裡面定義 const ,需加上 static,否則將會 compilation-error。

class TestConst{
	static const VALUE = 1000;
}

const 除了可以定義常數之外,還可以建立常數。

var foo = const[];
final bar = const[];
const baz = []; //等於 const[];

foo[0] = 1; // Cannot modify an unmodifiable list
foo = [1, 2]; // OK

bar[0] = 1; // Cannot modify an unmodifiable list
bar = [1, 2] //Compilation-error

小結

目前 Dart 在建立變數的時候,若沒有指定值,其預設值是 null,在使用上的時候需要小心。

類型推斷可以減少多餘的型態定義,但是在定義變數時帶入型態,可以避免設定初始值時設定錯誤。

var, final 都是屬於 run time 產生的數值,如果需要一個編譯期的常數,可以使用 const 關鍵字來定義變數。

如果在類別中定義 const 變數,則必須加上 static 關鍵字,才不會發生錯誤。


上一篇
Day1 - Hello World!
下一篇
Day3:內建型態-數字 (Numbers)
系列文
Dart 語言 - 開啟 Flutter 的鑰匙30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言