Dart-Typedefs

1. typedef 概述

typedef(類型定義)用于為函數類型定義一個別名,使代碼更易讀和維護。通過 typedef,可以將復雜的函數類型簡化為一個更具描述性的名稱,增強代碼的可讀性。

2. 定義 typedef

typedef Name = ExistingType;

在函數類型中,通常使用以下語法:

typedef ReturnType Name(ParameterType1 param1, ParameterType2 param2);

3. 示例

typedef IntBinaryOperation = int Function(int a, int b);

int add(int a, int b) => a + b;
int subtract(int a, int b) => a - b;

void main() {
  IntBinaryOperation operation;

  operation = add;
  print(operation(3, 4)); // 輸出: 7

  operation = subtract;
  print(operation(3, 4)); // 輸出: -1
}

解釋一下這段函數代碼

typedef定義

1、這行代碼使用 typedef 定義了一個名為 IntBinaryOperation 的函數類型別名。這個別名表示一個函數,它接受兩個 int 類型的參數,并返回一個 int 類型的結果。
2、IntBinaryOperation:這是我們給這個函數類型起的名字。
int Function(int a, int b):這是函數類型簽名,表示函數接受兩個 int 類型的參數 a 和 b,并返回一個 int 類型的結果。

函數定義

int add(int a, int b) => a + b;
int subtract(int a, int b) => a - b;

int add(int a, int b) => a + b;:這是一個普通的函數,接受兩個 int 類型的參數 a 和 b,返回它們的和。
int subtract(int a, int b) => a - b;:這是另一個普通的函數,接受兩個 int 類型的參數 a 和 b,返回 a 減 b 的結果。

main 函數

void main() {
  IntBinaryOperation operation;
  
  operation = add;
  print(operation(3, 4)); // 輸出: 7

  operation = subtract;
  print(operation(3, 4)); // 輸出: -1
}

步驟解析:
IntBinaryOperation operation;

聲明了一個名為 operation 的變量,其類型是我們之前定義的 IntBinaryOperation。也就是說,這個變量可以引用任何符合 IntBinaryOperation 類型簽名的函數。
operation = add;

將 add 函數賦值給 operation 變量。現在,operation 變量引用的是 add 函數。
print(operation(3, 4)); // 輸出: 7

調用 operation 函數,傳入參數 3 和 4。由于此時 operation 引用了 add 函數,所以實際執行的是 add(3, 4),結果是 7,并打印輸出。
operation = subtract;

將 subtract 函數賦值給 operation 變量。現在,operation 變量引用的是 subtract 函數。
print(operation(3, 4)); // 輸出: -1

調用 operation 函數,傳入參數 3 和 4。由于此時 operation 引用了 subtract 函數,所以實際執行的是 subtract(3, 4),結果是 -1,并打印輸出。

4、泛型 typedef

typedef 也可以與泛型一起使用,定義更加通用的函數類型別名。

 typedef Compare<T> = int Function(T a, T b);

int compareInt(int a, int b) => a - b;
int compareStringLength(String a, String b) => a.length - b.length;

void main() {
  Compare<int> intComparer = compareInt;
  Compare<String> stringLengthComparer = compareStringLength;

  print(intComparer(3, 4)); // 輸出: -1
  print(stringLengthComparer("hello", "world!")); // 輸出: -1
}

Compare<T> 是一個泛型函數類型別名,表示接受兩個類型為 T 的參數并返回一個 int。
intComparer 和 stringLengthComparer 分別是用于比較 int 和 String 長度的函數。

5、使用 typedef 提升代碼可讀性

typedef 可以在多個地方提升代碼的可讀性和可維護性,特別是在回調函數和事件處理程序中。

typedef EventCallback = void Function(String event);

class Button {
  EventCallback? onClick;

  void click(String event) {
    if (onClick != null) {
      onClick!(event);
    }
  }
}

void main() {
  var button = Button();

  button.onClick = (event) => print('Button clicked: $event');
  button.click('start'); // 輸出: Button clicked: start
}

EventCallback 是一個函數類型別名,表示接受一個 String 參數并返回 void。
Button 類使用 EventCallback 類型來定義 onClick 回調函數,使事件處理邏輯更加清晰。
下面來詳細解釋下這段代碼

Typedef 定義

typedef EventCallback = void Function(String event);

(1)用 typedef 關鍵字定義函數類型別名
(2)函數類型別名為EventCallback
(3)右邊指定了函數類型,并且該函數接收一個string類型的參數 event,這個函數沒有返回值 返回void

定義 Button 類

class Button {
  EventCallback? onClick;

  void click(String event) {
    if (onClick != null) {
      onClick!(event);
    }
  }
}

1、定義 Button 類
2、定義一個名為 onClick 的可選屬性(EventCallback? 表示該屬性可以是 EventCallback 類型的函數,也可以是 null)。
3、onClick 是一個函數類型的變量,用于存儲事件回調函數。
4、void click(String event) {:
定義一個名為 click 的方法,該方法接受一個 String 類型的參數 event,并且沒有返回值(返回類型為 void)。
5、if (onClick != null) {:
檢查 onClick 是否不為 null。
6、onClick!(event);:
如果 onClick 不為 null,則調用 onClick 回調函數,并傳遞 event 參數。
onClick! 中的 ! 表示強制解包(告訴編譯器 onClick 在這里肯定不是 null)。

主函數 main

void main() {
  var button = Button();

  button.onClick = (event) => print('Button clicked: $event');
  button.click('start'); // 輸出: Button clicked: start
}

void main() {:

定義程序的主入口函數 main。
var button = Button();:

創建一個 Button 類的實例,并賦值給變量 button。
button.onClick = (event) => print('Button clicked: $event');:

為 button 實例的 onClick 屬性賦值一個匿名函數(lambda 表達式)。
這個匿名函數接受一個 String 類型的參數 event,并將其輸出到控制臺。
button.click('start');:

調用 button 實例的 click 方法,并傳遞 start 作為參數。
click 方法會檢查 onClick 是否不為 null,如果不為 null,則調用 onClick 回調函數,最終輸出 Button clicked: start

6、總結

typedef 是 Dart 中強大的功能,可以簡化函數類型的定義,提高代碼的可讀性和可維護性。通過使用 typedef,可以更輕松地管理復雜的回調函數和泛型函數類型。

主要要點:
使用 typedef 為函數類型定義別名。
通過 typedef 提高代碼的可讀性。
typedef 可以與泛型一起使用,定義通用的函數類型。
在回調函數和事件處理程序中使用 typedef 使代碼更清晰。
通過對 typedef 的理解和實踐,可以編寫更簡潔、可維護的 Dart 代碼。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容