Block-介绍

2017-05-25  本文已影响26人  正直走
^(int param){
     NSLog(@"%d",param);
};

上面是它的缩写形式,其完整的形式应该如下

^void(int param){
        NSLog(@"%d",param);
};

而C语言最简单的定义带参函数形式如下

void param(int param){
}

可以看出完整形式的Block语法与一般的C语言函数相比仅有两点不同

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。
上一篇 下一篇

猜你喜欢

热点阅读