block的高级用法(二) -- block作为返回值,链式编程思想

相信用过Masonry框架的同学,估计都对里面的调用方式记忆犹新 -- 都是用点语法调用的

他是怎么做到的能这样一直调用呢?大家可以思考下,在iOS中,一个函数的返回值还能添加参数的,

会是什么实现呢?其实不难想到那就是 -- block。

好了废话不多说,直接入正题。先打个比方说下,我想事先下面函数的调用功能:

 manager.add(5).add(5).add(5);
从此行代码看,manager能无限的调用add方法,那么manager.add(5)返回的类型必定也为也为manager的类型。

加上上面的分析返回值还能添加参数,那么就是一个block的类型返回值。

所以我打算创建一个加法器,用上面的方法调用。

首先定义一个CalculateManager类:

#import <Foundation/Foundation.h>

@interface CalculateManager : NSObject

/** 用来存放相加的结果 */
@property (nonatomic, assign) NSInteger result;

//返回值为一个CalculateManager *(^)(NSInteger)类型的block
- (CalculateManager *(^)(NSInteger))add;

@end
我们重点来分析下add函数.

1.返回值:返回值是add前面的整个括号括起来的一个类型,也就是CalculateManager *(^)(NSInteger)类型的block。

2.分析block:CalculateManager *为block的返回值。NSInteger为block的参数。如图所示:


仔细品味这个图示,相信你会明白的,如果还有疑问的,建议你好好复习下block。

然后就剩下CalculateManager类的add函数的实现了:

#import "CalculateManager.h"

@implementation CalculateManager

- (CalculateManager *(^)(NSInteger))add {
    
    return  ^(NSInteger value) {
        _result += value;
        return self;
    };
}

@end

我们接着往下看,为了能实现代码的可读性,就像Masonry那样,把它的实现放在一个block中,集中在一起,大家可以先自己想下怎么来实现这个功能。

我现在想到一个比较好的处理就是实现一个NSObject类的分类,并且是静态方法,这样的话,就可以直接用NSObject来调用了,来对CalculateManager类

进行管理,并且直接返回结果,具体定义如下:

#import <Foundation/Foundation.h>
#import "CalculateManager.h"

@interface NSObject (Calculate)

+ (NSInteger)why_makeCalculate: (void(^)(CalculateManager *))block;

@end
方法的具体实现如下:

+ (NSInteger)why_makeCalculate:(void(^)(CalculateManager *))block {
    
    CalculateManager *manager = [[CalculateManager alloc] init];
    block(manager);
    return manager.result;
}
所以外部加法计算器的具体调用为:

#import "ViewController.h"
#import "NSObject+Calculate.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSInteger value = [NSObject why_makeCalculate:^(CalculateManager *manager) {
        manager.add(5).add(5).add(5).add(10);
    }];
    
    NSLog(@"%zd", value);
}

@end
打印结果为:

打印结果正确,程序是正确的。我们主要在这里学习它的编程思想,用到了传说中的链式编程思想。

具体源码在我的GitHub里,想要的点击这里


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值