Block做为参数使用,常见于各框架之中,好比在封装一个类时,当作什么事情由外界去决定,何时调用由本身的类决定时,这时候就须要将block做为参数使用。框架
下面咱们模仿AFNetworking的manager,以自定义一个简单的工具类CalculatorManager为例:
1.CalculatorManager.h文件工具
#import <Foundation/Foundation.h> @interface CalculatorManager : NSObject /** 计算结果值*/ @property(assign, nonatomic) int result; +(instancetype)sharedCalculatorManager; //block做为参数时格式与其它类型定义时一致,都是(类型)变量名,看起来有些晕人 -(void)calculate:(int(^)(int))calculateBlock; @end
2.CalculatorManager.m文件atom
#import "CalculatorManager.h" static CalculatorManager *instance = nil; @implementation CalculatorManager //单例(可忽略) +(instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (instance == nil) { instance = [super allocWithZone:zone]; } }); return instance; } +(instancetype)sharedCalculatorManager { return [[self alloc] init]; } //方法中定义了一个block数据类型参数(返回值为int类型的,且带有一个int类型的形参) -(void)calculate:(int (^)(int))calculateBlock { //calculateBlock接受外界传入的代码块,也就意味着怎么去操做是由外界调用者决定的 _result = calculateBlock(_result);//将_result的值做为实参传入 } @end
3.外界控制器调用spa
-(void)viewDidLoad { [super viewDidLoad]; CalculatorManager *manager = [CalculatorManager sharedCalculatorManager]; [manager calculate:^int(int i) { //参数i自加1,而后返回 i++; return i; }]; NSLog(@"%d",manager.result);//输出结果为1 }
能够看到,工具类CalculcatorManager的计算方法calculate:^int(int)calculateBlock
其具体实现,交由了外界的控制器调用者去决定了。虽然有些许绕,但只要搞清楚block的做为参数使用时的格式,理解起来也很快的,若是先前对这类型的用法在理解上抱有疑惑的话,但愿这个小例子能帮到您:)code