曾经面试过一个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; };