第六章 塊與大中樞派發(fā)—第38條:為常用的塊類型創(chuàng)建typedef

每個(gè)塊都具備其"固有類型"暴区,因而可將其賦給適當(dāng)類型的變量闯团。這個(gè)類型由塊所接受的參數(shù)及其返回值組成。

^(BOOL flag, int value){
    if (flag) {
        return value * 5;
    } else {
        return value * 10;
    }
}

此塊接受兩個(gè)類型分別為BOOL及int的參數(shù)仙粱,并返回類型為int的值房交。如果想把它賦給變量,則需注意其類型伐割。變量類型及相關(guān)賦值語句如下:

int (^variableName)(BOOL flag, int value) = ^(BOOL flag, int value){
    // Implementation
    return someInt;
}

這個(gè)類型似乎和普通的類型大不相同候味,然而如果習(xí)慣函數(shù)指針的話,那么看上去就會覺得眼熟了隔心。塊類型的語法結(jié)構(gòu)如下:

return_type (^block_name)(parameters);

與其他類型的變量不同白群,在定義塊變量時(shí),要把變量名放在類型之中硬霍,而不要放在右側(cè)帜慢。這種語法非常難記,也非常難懂须尚。鑒于此崖堤,應(yīng)該為常用的塊類型起個(gè)別名,尤其是打算把代碼發(fā)布成API供他人使用時(shí)耐床,更應(yīng)這樣做密幔。開發(fā)者可以起個(gè)更為易讀的名字來表示塊的用途,而把塊的類型隱藏在其后面撩轰。
為了隱藏復(fù)雜的塊類型胯甩,需要用到C語言中名為"類型定義"(type definition)的特性。typedef關(guān)鍵字用于給類型起個(gè)已讀的別名堪嫂。比方說偎箫,想定義新類型,用以表示接受BOOL及int參數(shù)并返回int值的塊皆串,可通過下列語句來做:

typedef int(^EOCSomeBlock)(BOOL flag, int value);

聲明變量時(shí)淹办,要把名稱放在類型中間,并在前面加上"^"符號恶复,而定義新類型時(shí)也得這么做怜森。上面這條語句向系統(tǒng)中新增了一個(gè)名為EOCSomeBlock的類型速挑。此后,不用再以復(fù)雜的塊類型來創(chuàng)建變量了副硅,直接使用類型即可:

EOCSomeBlock block = ^(BOOL flag, int value) {
    //Implementation
};

這樣代碼讀起來就順暢多了: 與定義其他變量時(shí)一樣姥宝,變量類型放在左邊,變量名放在右邊恐疲。
通過這項(xiàng)特性腊满,可以把使用塊的API做的更為易用些。類里面有些方法可能需要用塊來做參數(shù)培己,比如執(zhí)行異步任務(wù)時(shí)所用的"completion handler"(任務(wù)完成后所執(zhí)行的處理程序)參數(shù)就是塊碳蛋,凡遇到這種情況,都可以通過定義別名使代碼變得更為易讀漱凝。比方說疮蹦,類里有個(gè)方法可以啟動任務(wù),它接受一個(gè)塊作為處理程序茸炒,在完成任務(wù)之后執(zhí)行這個(gè)塊愕乎。若不定義別名,則方法簽名會像下面這樣:

- (void)startWithCompletionHandler:(void(^)(NSData *data, NSError *error))completion;

注意壁公,定義方法參數(shù)所用的塊類型語法感论,又和定義變量時(shí)不同,若能把方法簽名中的參數(shù)類型寫成一個(gè)詞紊册,那讀起來就順口多了比肄。于是,可以給參數(shù)類型起個(gè)別名囊陡,然后使用此名稱來定義:

typedef void(^EOCCompletionHandler)(NSData *data, NSError *error);
- (void)startWithCompletionHandler:(EOCCompletionHandler)completion;

使用類型定義還有個(gè)好處芳绩,就是當(dāng)你打算重構(gòu)塊的類型簽名時(shí)會很方便。比方說撞反,要給原來的completion handler塊再加一個(gè)參數(shù)妥色,用以表示完成任務(wù)所花的時(shí)間,那么只需修改類型定義語句即可:

typedef void(^EOCCompletionHandler)(NSData *data, NSTimeInterval duration, NSError *error);

修改之后遏片,凡是使用了這個(gè)類型定義的地方嘹害,比如方法簽名等處,都會無法編譯吮便,而且報(bào)的都是同一種錯(cuò)誤笔呀,于是開發(fā)者可據(jù)此逐個(gè)修復(fù)。若不用類型定義髓需,而直接寫塊類型许师,那么代碼中要修改的地方就更多了。開發(fā)者很容易忘掉其中一兩處,從而引發(fā)難于排查的bug枯跑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惨驶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子敛助,更是在濱河造成了極大的恐慌,老刑警劉巖屋确,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纳击,死亡現(xiàn)場離奇詭異,居然都是意外死亡攻臀,警方通過查閱死者的電腦和手機(jī)焕数,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刨啸,“玉大人堡赔,你說我怎么就攤上這事∩枇” “怎么了善已?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長离例。 經(jīng)常有香客問我换团,道長,這世上最難降的妖魔是什么宫蛆? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任艘包,我火速辦了婚禮,結(jié)果婚禮上耀盗,老公的妹妹穿的比我還像新娘想虎。我一直安慰自己,他們只是感情好叛拷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布舌厨。 她就那樣靜靜地躺著,像睡著了一般胡诗。 火紅的嫁衣襯著肌膚如雪邓线。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天煌恢,我揣著相機(jī)與錄音骇陈,去河邊找鬼。 笑死瑰抵,一個(gè)胖子當(dāng)著我的面吹牛你雌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼婿崭,長吁一口氣:“原來是場噩夢啊……” “哼拨拓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氓栈,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤渣磷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后授瘦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醋界,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年提完,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了形纺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徒欣,死狀恐怖逐样,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情打肝,我是刑警寧澤脂新,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站闯睹,受9級特大地震影響戏羽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜楼吃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一始花、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孩锡,春花似錦酷宵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荣挨,卻和暖如春男韧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背默垄。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工此虑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人口锭。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓朦前,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子韭寸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 《編寫高質(zhì)量iOS與OS X代碼的52個(gè)有效方法》--第六章 第38條(ps:此乃讀書筆記春哨,加深記憶,僅供大家參考...
    z_zero閱讀 249評論 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,783評論 1 10
  • 第六章 block與GCD “塊”(block)是一種可在C恩伺、C++及Objective-C代碼中使用的“詞法閉包...
    Code_Ninja閱讀 1,045評論 2 4
  • 文:落下絮 本故事純屬虛構(gòu) 李小萌第一次看見張小燕赴背,是張小燕轉(zhuǎn)學(xué)來的那天。下著雨莫其,老師在講臺上介紹新來的轉(zhuǎn)學(xué)生癞尚,別...
    落下絮閱讀 325評論 0 2
  • 2017-9-24(19/99) 感恩 —— 做了金色之光冥想,提升能量乱陡,凈化磁場。 感恩 —— 客廳也用上了香薰...
    慢慢花開閱讀 227評論 0 0