曾經面試過一個iOS開發,讓他寫一個參數是int返回值是void的Block聲明,這位同學思考了一會兒只能很尷尬的說不太會寫。相信很多iOS開發者剛剛接觸到Block的時候,都會對Block的寫法有或多或少的疑惑,本文采用一種比較容易理解的方式介紹Block的聲明語法、實現語法和省略語法。只要有C語言基礎,相信閱讀完本文后就能夠很輕松的寫出無論多么復雜的Block。
Block的聲明語法
Block的語法其實和C函數指針比較類似,比如下面聲明一個返回值為int,名字是add,參數是兩個int的C函數指針:
int (*add)(int, int);
我們將*修改為^就可以得到一個返回值是int,名字是add,參數是兩個int的Block聲明:
int (^add)(int, int);
Block的實現語法
Block的實現語法也類似與C函數:
^int (int a, int b) {
return a + b;
};
C函數:
int add(int a, int b) {
return a + b;
}
我們可以將Block理解為C語言的匿名函數,與C函數相比,Block去掉了函數名,在返回值前加了^。
Block的省略語法
我們經常看到下面這種形式的寫法:
^{ NSLog(@"hello world"); };
這是因為Block的返回值是void或者參數是void的時候,可以省略返回值或者參數,上面的Block相當于:
^void (void) { NSLog(@"hello world"); };
當然下面這種形式的Block也是合法的:
^ (int a) { a++; };
^int { return 0; };