Dart-Typedefs

1. typedef 概述

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

2. 定義 typedef

typedef Name = ExistingType;

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

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
}

解釋一下這段函數(shù)代碼

typedef定義

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

函數(shù)定義

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

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

main 函數(shù)

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

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

步驟解析:
IntBinaryOperation operation;

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

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

調(diào)用 operation 函數(shù),傳入?yún)?shù) 3 和 4。由于此時 operation 引用了 add 函數(shù),所以實際執(zhí)行的是 add(3, 4),結(jié)果是 7,并打印輸出。
operation = subtract;

將 subtract 函數(shù)賦值給 operation 變量?,F(xiàn)在,operation 變量引用的是 subtract 函數(shù)。
print(operation(3, 4)); // 輸出: -1

調(diào)用 operation 函數(shù),傳入?yún)?shù) 3 和 4。由于此時 operation 引用了 subtract 函數(shù),所以實際執(zhí)行的是 subtract(3, 4),結(jié)果是 -1,并打印輸出。

4、泛型 typedef

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

 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> 是一個泛型函數(shù)類型別名,表示接受兩個類型為 T 的參數(shù)并返回一個 int。
intComparer 和 stringLengthComparer 分別是用于比較 int 和 String 長度的函數(shù)。

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

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

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 是一個函數(shù)類型別名,表示接受一個 String 參數(shù)并返回 void。
Button 類使用 EventCallback 類型來定義 onClick 回調(diào)函數(shù),使事件處理邏輯更加清晰。
下面來詳細(xì)解釋下這段代碼

Typedef 定義

typedef EventCallback = void Function(String event);

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

定義 Button 類

class Button {
  EventCallback? onClick;

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

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

主函數(shù) main

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

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

void main() {:

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

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

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

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

6、總結(jié)

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容