在 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
可以替原有的類別新增函數,我們不需要繼承該類別,實作有的沒有的,直接就可以增加我們需要的函數。
由上方的範例更可以發現,我們可以在我們自己定義的擴充函數加上一些例外處理,將例外處理封裝在函數裡,外面的呼叫者就不需要自行處理。
擴充函數要避免重複的名稱,如果有重複的名稱,就要使用擴充函數的名稱來指定使用特定的擴充函數。