前面介绍了Block用于保存代码,传值的使用场景,这篇blog介绍Block用作方法参数以及返回值
1、用作参数
开发中我们最常见的block用作方法参数,是我们要执行一段动画时,使用系统的UIView方法执行动画。
[UIView animateWithDuration:.5f animations:^{
NSLog(@"所要做的事");
}];
block用作方法参数,我们什么时候用block作为方法参数呢?由上面代码所知,我们只需要把我们所要做的事情写在block里面,而不需要知道什么时候去做这些事情。
总结
block用作方法参数的时机是:需要做的事情由外部决定,具体什么时候去执行由内部决定。
假设有种需求,我们需要封装一个计算器,提供一个计算方法,具体是执行加减乘除我们不知,由外部决定。
代码如下:
CalcutorManager.h
@interface CalcutorManager : NSObject
@property (nonatomic,assign) NSInteger result;
- (void)calcutor:(NSInteger(^)(NSInteger para))block;
@end
CalcutorManager.m
@implementation CalcutorManager
- (void)calcutor:(NSInteger (^)(NSInteger prar))block {
if (block) {
_result = block(_result);
}
}
@end
ViewController.m
CalcutorManager *mgr = [[CalcutorManager alloc] init];
[mgr calcutor:^NSInteger(NSInteger para) {
return para += 5;
}];
NSLog(@"%ld", mgr.result);
输出结果为:5
2、用作返回值
Block用于返回值,最经典的就是Masonry,SDAutoLayout等。
make.center.mas_equalTo(superView);
链式编程思想,所有的语句用.连接起来,可读性很好。
我们平时写一个方法,然后去调用,大部分都是用中括号来调用。比如有如下方法:
- (void(^)(void))test {
return ^{
};
}
//调用
void(^block)(void) = [self test];
//也可以这样
self.test();
给上面的需求类CalcutorManager 增加一个实例方法
- (CalcutorManager *(^)(int))add;
- (CalcutorManager *(^)(int))add {
return ^(int value){
self.result += value;
return self;
};
}
在外部调用
mgr.add(5).add(5);
NSLog(@"%ld", mgr.result);
输入结果为: 10
网友评论