昨天使用一个小例子简单说明了下Block作为参数时的使用。
今天再来复习一下Block作为返回值使用时的情况,先贴一小段热门第三方框架Masonry的官方sample code:[view1 mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(superview).with.insets(padding);}];
其中关于...equalTo(superview).....insets(padding)
淡定,还记得block的基本用法吗block(参数)
,其实这里就是使用了Block用作了方法的返回值,同时在Block里面又返回了self自身而形成了一个链式结构。这样说有些抽象,我们还是以昨天那个CalculatorManager工具类为例。
版本1.0
首先,我们先在工具类中实现一个很简单的方法:外界传递一个整形参数,然后将其与原结果值相加,再保存起来作为新的结果值。 CalculatorManager.h文件#import@interface CalculatorManager : NSObject/** 结果值*/@property(assign, nonatomic) int result;-(void)add:(int)value;@end
CalculatorManager.m文件
#import "CalculatorManager.h"@implementation CalculatorManager-(void)add:(int)value{ _result += value;}@end
假设现在外部控制器调用该方法,需要计算得出从1加到4的结果值:
-(void)viewDidLoad { [super viewDidLoad]; CalculatorManager *manager = [[CalculatorManager alloc] init]; [manager add: 1]; [manager add: 2]; [manager add: 3]; [manager add: 4]; NSLog(@"%d", manager.result);}
代码行数这么多,一股强烈的弱者气息.....于是:
版本1.1:
修改(void)add:(int)方法,添加返回值,返回值为工具类self自身:-(instancetype)add:(int)value{ _result += value; return self;}
这样外界控制器调用该方法时,就变成这样了:
- (void)viewDidLoad { [super viewDidLoad]; CalculatorManager *manager = [[CalculatorManager alloc] init]; [[[[manager add:1] add:2] add:3] add:4]; NSLog(@"%d", manager.result);}
代码变成了一行,比起之前清爽多了,但这长长的中括号[
嵌套看起来还是弱爆了,于是:
版本1.2
继续修改(instancetype)add:(int)方法,将方法的返回值,替换为:一个返回值为CalculatorManager instance的Block代码块:-(CalculatorManager *(^)(int))add{ //方法本身返回一个blockd代码块 return ^CalculatorManager *(int value){ _result += value; //block块内部再返回一个instance实例 return self; };}
这样外界就可以通过点语法这样调用:
- (void)viewDidLoad { [super viewDidLoad]; CalculatorManager *manager = [[CalculatorManager alloc] init]; manager.add(1).add(2).add(3).add(4); NSLog(@"%d", manager.result);}
瞬间逼格就提高了不少有木有(=゚ω゚)ノ。言归正传,据说这个叫链式编程思想,好处在于可以将多个方法,用点语法的方式链接起来,显得简洁、可读性高。
如果先前对Block这类型的用法在理解上抱有疑惑的话,希望这个小例子能帮到您:)