代碼塊

OC加入代碼塊的功能,可以將一塊代碼當(dāng)做一個對象一樣對待,并且傳遞給其他方法或函數(shù).代碼塊支持在代碼中定義一個函數(shù)對象,這個函數(shù)對象可以通過傳統(tǒng)的變量來引用,也可以將其傳入到其他函數(shù),這就意味著,你可以定義可復(fù)用的代碼段,并且可以向?qū)ο笠粯拥教巶鬟f從而動態(tài)地在其他對象內(nèi)部執(zhí)行.這聽起來可能讓你有點迷惑,不過沒有關(guān)系,通過這里的幾個例子,你可以輕松的理解并能夠使用代碼塊,它遠沒有你想象的那么難

代碼塊本質(zhì)上適合其他變量類似.不同的是,代碼塊存儲的數(shù)據(jù)是一個函數(shù)體,脫字符(^)是代碼塊的語法標(biāo)記,按照我們熟悉的語法規(guī)約定義返回值绅这、參數(shù)以及代碼塊的主體(也就是可以執(zhí)行的代碼).首先我們來看一個最最簡單的代碼塊的示例:

//代碼塊聲明
void(^Block)(NSString *x);
//代碼塊變量賦值(代碼塊變量中存的是函數(shù)體)
aBlock = ^(NSString *x){
???? NSLog(@"%@",x);
}

代碼塊變量的聲明要比普通變量聲明復(fù)雜,普通變量聲明不需要傳入?yún)?shù),并且沒有返回值.也因為代碼塊變量存儲的數(shù)據(jù)是一個函數(shù)體,所以聲明代碼塊變量時需要聲明參數(shù)和返回類型,對于一個代碼塊變量的聲明,可以這么做:
?? 語法:
?????? 返回值類型(^代碼塊名字)(參數(shù)列表);

分析上面的代碼,注意第8行代碼,聲明了一個保存代碼塊的變量aBlock,最前面的void 說明代碼塊執(zhí)行時沒有返回值.緊跟著返回值類型定義的是一個特殊操作符,它告訴編譯器所定義的是代碼塊而不是其他類型的變量,這個操作字符就是多字符(^).

在^字符之后,給出了存儲代碼塊的變量名 aBlock,這個變量名同脫字符(^)一起使用小括號同其后的參數(shù)隔開.

提示:在列出參數(shù)時,無需提供參數(shù)的變量名,是否提供變量名由你來決定,但這不是必須的.也許這樣理解比較好:目前還沒有聲明函數(shù)體,所以提供參數(shù)的變量名沒有任何作用,因為暫時不會用到它.你僅需告訴編譯器參數(shù)的類型即可,多個參數(shù)類型要以逗號隔開.很多代碼塊的文檔在聲明時都省略了參數(shù)名,但我不會這樣做,因為我覺得這樣的代碼會使初學(xué)者迷惑.


記得最后要以分號結(jié)束語句.到目前為止,我們聲明了一個變量aBlock,用于存儲代碼塊.它接收指定參數(shù)并返回指定的值類型.

但是,僅僅聲明變量是不夠的.我們需要給這個代碼塊變量賦值,那么給代碼塊賦值的時候,可以這么做:

語法:
???? 代碼塊名字 = ^(參數(shù)列表) {代碼塊的行為主體};

//代碼塊變量聲明的同時賦值
int mulitplier = 7;
int(^myBlock)(int) = ^(int num){
???? return num *mulitplier;
};
void(^aVoidBlock)() = ^{
????? NSLog(@"I am a aVoidBlock!");
}

聲明和實現(xiàn):

//代碼塊的聲明

double(^getArea)(double width,double height);

//代碼塊的實現(xiàn)

getArea = ^(double width,double height){

double area = width * height;

return area;

};

double area = getArea(5,10);

NSLog(@"area = %.2f",area);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掘托,一起剝皮案震驚了整個濱河市谆奥,隨后出現(xiàn)的幾起案子赡若,更是在濱河造成了極大的恐慌闲礼,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锌蓄,死亡現(xiàn)場離奇詭異驾荣,居然都是意外死亡,警方通過查閱死者的電腦和手機帆吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門域那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事次员“苄恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵淑蔚,是天一觀的道長市殷。 經(jīng)常有香客問我,道長刹衫,這世上最難降的妖魔是什么醋寝? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮带迟,結(jié)果婚禮上音羞,老公的妹妹穿的比我還像新娘。我一直安慰自己仓犬,他們只是感情好嗅绰,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著婶肩,像睡著了一般办陷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上律歼,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音啡专,去河邊找鬼险毁。 笑死,一個胖子當(dāng)著我的面吹牛们童,可吹牛的內(nèi)容都是我干的畔况。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼慧库,長吁一口氣:“原來是場噩夢啊……” “哼跷跪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起齐板,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吵瞻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后甘磨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橡羞,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年济舆,在試婚紗的時候發(fā)現(xiàn)自己被綠了卿泽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡滋觉,死狀恐怖签夭,靈堂內(nèi)的尸體忽然破棺而出趟畏,到底是詐尸還是另有隱情,我是刑警寧澤伐憾,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布望抽,位于F島的核電站,受9級特大地震影響煌妈,放射性物質(zhì)發(fā)生泄漏儡羔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一璧诵、第九天 我趴在偏房一處隱蔽的房頂上張望汰蜘。 院中可真熱鬧,春花似錦之宿、人聲如沸族操。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽色难。三九已至,卻和暖如春等缀,著一層夾襖步出監(jiān)牢的瞬間枷莉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工尺迂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笤妙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓噪裕,卻偏偏與公主長得像蹲盘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子膳音,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,814評論 1 10
  • 2014年的蘋果全球開發(fā)者大會(WWDC)召衔,當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,294評論 0 9
  • 小時候在外婆家長大颗胡,每天肚子餓的時候外婆會給我泡一碗饃饃毫深,他從酒廠回來總會跟我開玩笑:咦,你又在吃啦毒姨? 上小學(xué)的時...
    一如既往加油閱讀 202評論 2 2
  • 八點鐘的高鐵 五點半起床 六點鐘出發(fā) 開車前兩分鐘 新同事坐在臨邊 一直都帶著耳機 我也不想說話 高鐵離開北京 才...
    董文閱讀 174評論 0 0
  • 《結(jié)構(gòu)思考力》 賣點包裝——讓觀點容易記 通過對要點的語言包裝可以讓對方更容易記憶哑蔫。比如,出門4件事知道是什么嗎?...
    幸福虛度的野人閱讀 238評論 0 3