iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
Software Development

Dart 語言 - 開啟 Flutter 的鑰匙系列 第 25

Day 25:擴充方法 (Extension method)

在 Dart2.7 新增關鍵字 extension ,用來替已經存在的類別擴充功能。

例如:

toString(),是每一個類別都有的函數,我們若用在整數上,便可以將整數轉成為字串的形式。

var twenty = 20.toString();
print(twenty.runtimeType);
//String

你可能會想,在 String 類有沒有 toInt()?

答案是沒有。

'20'.toInt(); //Compiliation-error

那麼我們就可以利用關鍵字 extension 替 String 類新增一個函數,專門轉換字串成整數。

  • extension 的語法如下
extension name on Type{
	//define method
}

例如:

extension IntegerParse on String{
	int toInt(){
		return int.parse(this);
	}
}

我們就可以直接在字串上使用 toInt() 函數。

var value = '20'.toInt();
print(value);
print(value.runtimeType);
//20
//int

介紹到這邊,你可能發現一件事,我們在 extension 後方加上的名稱並沒有使用到。

我們可以將上方的範例改寫為:

var value = IntegerParse('20').toInt();
  • 將數值用 extension 定義的名稱包起來,就表示用這個擴充函數來操作。

擴充函數命名衝突

當不同的擴充函數定義了相同的方法,此時就可以有效區隔是哪一個擴充函數。

例如:

有另一個擴充函數 (IntegerParse2),在使用 toInt() 時,有包含例外處理。

extension IntegerParse on String{
	int toInt(){
		return int.parse(this);
	}
}

extension IntegerParse2 on String{
	int toInt(){
    var value = -1;
    try{
      value = int.parse(this);
    }catch(e){

    }
    return value;
  }
}

我們就可以用擴充函數的名稱包住想使用 (IntegerParser2) 的字串。

var value = IntegerParse2('').toInt();
print(value);
print(value.runtimeType);
//-1
//int

小結

extension 可以替原有的類別新增函數,我們不需要繼承該類別,實作有的沒有的,直接就可以增加我們需要的函數。

由上方的範例更可以發現,我們可以在我們自己定義的擴充函數加上一些例外處理,將例外處理封裝在函數裡,外面的呼叫者就不需要自行處理。

擴充函數要避免重複的名稱,如果有重複的名稱,就要使用擴充函數的名稱來指定使用特定的擴充函數。


上一篇
Day 24:異步處理 Part2-Stream
下一篇
Dart 26:用 import 匯入其他函式庫
系列文
Dart 語言 - 開啟 Flutter 的鑰匙30

尚未有邦友留言

立即登入留言