Block
简单介绍
首先Block
是iOS中比较特殊的一种数据类型
Block
是苹果官方比较推荐使用的数据类型,应用也比较广泛
动画、多线程、集合遍历、网络请求回调Block
的作用
Block
用来保存一段代码,可以再恰当的时机取出调用,功能类似于函数和方法Block
语法
Block最常见的形式如下
^(int param){
NSLog(@"%d",param);
};
上面是它的缩写形式,其完整的形式应该如下
^void(int param){
NSLog(@"%d",param);
};
而C语言最简单的定义带参函数形式如下
void param(int param){
}
可以看出完整形式的Block语法与一般的C语言函数相比仅有两点不同
没有函数名
带有"^"
其中没有函数名是因为它是匿名函数,而带有“^”是容易辨识查找简单使用
没有参数没有返回值,在没有返回值的时候void也是缺省值
void (^block) = ^{
NSLog(@"%d",param);
};
有参数和返回值
int (^block)(int) = ^int(int param){
NSLog(@"%d",param);
return param *param;
};```
提示:当有返回值的时候第三个`int`即'^'后面的返回值类型是可以省略的,但在该block当做参数的时候是不可以省略的。如`-(void)collectionfunDic:(void(^)(NSMutableDictionary *resDic))funDic`
如果没有返回值没有参数Block最简单的
- 使用```typedef```定义```Block```类型
typedef 顾名思义,其作用就是定义一种类型,它可以定义枚举,枚举也是相当于定义了一种新的类型,如下例
typedef enum {
HeoroTypeSuperMan,
HeoroTypeSuperGirl
}HeoroType;
该枚举相当于是定义了一种```HeoroType```的类型。
那么block同时也可以定义一种数据类型,
我们以一个返回两个数值相加的block为例子如下
int (^minusBlock)(int, int) = ^(int num1, int num2) {
return num1 - num2;
};
同时再定义一个返回两个block相乘的block
int (^multiBlock)(int, int) = ^(int num1, int num2) {
return num1 * num2;
};
可以看出上面两个```block```在定义时除了变量名,不同其他都相同,那我们如果在定义相加或相除的```block```,那么他们的格式应该也基本一样,所以,我们完全可以用```typedef```将像这种的```block```定义为一种类型,如上面的```block```,我们可以定义成如下格式
typedef int (^MyBlock)(int, int);
那么上面的相减和相乘block就可以分别定义成
MyBlock minusBlock = ^(int num1, int num2) {
return num1 * num2;
};
MyBlock multiBlock = ^(int num1, int num2) {
return num1 * num2;
};
相对于最上面的定义,这样定义block有以下好处
- 代码精简,
- 更加直观
```代码精简```不必多说,如我们在定义加、减、乘、除的block,只需用MyBlock的block类型后面加上block的变量名就好。```更加直观```,如上相乘的block,MyBlock就是该block的类型,其定义的block变量需要传入两个int类型的参数,并且返回一个int类型的值。就如同```int result = 5;```myBlock就相当于int,multiBlock就相当于result。