每個塊具有其“固有類型”(inherent type),即它們可以賦值到恰當類型的變量烤镐。這個類型由輸入參數和返回類型組成阅酪。
我們可以為常用的塊類型起個別名。為了隱藏復雜的塊類型察绷,需要用到C語言中的“類型定義”(type definitions)的語言特性干签,即使用typedef關鍵字來定義一個易讀的別名,如下:
typedef return_type (^block_name)(parameters);
block_name var = ^(parameters){...};
最好與使用塊類型的類一起來定義這些typedef拆撼,而且命名別名時還應該把這個類的名字作為前綴容劳,這樣可以闡明塊的用途。還可以用typedef為同一個塊簽名類型創(chuàng)建多個別名闸度。
以typedef重新定義block類型竭贩,可以令block變量使用起來更簡單。
定義新類型時莺禁,應遵從現有命名習慣留量,勿使其名稱與別的類型相沖突。
不妨為同一個block簽名類型定義多個別名。即使要重構的代碼使用了block簽名類型的某一別名楼熄,也只需修改相應typedef中的block簽名即可忆绰,無需改動其他的別名。
如果我們需要重復創(chuàng)建某種塊(相同參數可岂,返回值)的變量错敢,我們就可以通過typedef來給某一種塊定義屬于它自己的新類型
例如:
int (^variableName)(BOOL flag, int value) =^(BOOL flag, int value){
// Implementation
return someInt;
}
這個塊有一個bool參數和一個int參數,并返回int類型缕粹。我們可以給它定義類型:
typedef int(^EOCSomeBlock)(BOOL flag, int value);
再次定義的時候稚茅,就可以通過簡單的賦值來實現:
EOCSomeBlock block = ^(BOOL flag, int value){
// Implementation
};
定義作為參數的塊:
- (void)startWithCompletionHandler: (void(^)(NSData *data, NSError *error))completion;
這里的塊有一個NSData參數,一個NSError參數并沒有返回值
typedef void(^EOCCompletionHandler)(NSData *data, NSError *error);
- (void)startWithCompletionHandler:(EOCCompletionHandler)completion;”
通過typedef定義塊簽名的好處是:如果要某種塊增加參數平斩,那么只修改定義簽名的那行代碼即可峰锁。