block的高级用法(二) -- block作为返回值,链式编程思想
来源:互联网 发布:php企业网站管理系统 编辑:程序博客网 时间:2024/05/22 13:19
相信用过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里,想要的点击这里
0 0
- block的高级用法(二) -- block作为返回值,链式编程思想
- 高逼格的block(链式编程思想 )
- Block的链式编程
- OC 重点block-------5-------block作为函数的返回值
- block的高级用法(一) -- block传值
- oc block链式编程
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
- iOS开发:界面之间传值之Block传值(Block高级用法:Block传值)
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
- 使用Block在两个界面之间传值(Block高级用法:Block传值)
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
- Block作为属性、方法参数、返回值
- iOS block (block中修改外部值并作为返回值)
- Block高级用法(传值)
- Block高级用法:Block传值UI_12(3)
- Block高级用法:Block传值UI_12(3)
- junit4.x 测试单元用例
- 安装android studio 卡死的解决方案
- 图像增强算法
- File Explorer中查看文件无法打开--权限问题
- Linux服务器下 PHP 安装 MongoDB扩展
- block的高级用法(二) -- block作为返回值,链式编程思想
- Android RecyclerView 使用完全解析 体验艺术般的控件
- 第4周 项目2--建设“单链表”算法库
- bzoj 4245 [ONTAK2015]OR-XOR 贪心
- Python中dict详解
- SDWebImage源代码解析(一)Cache
- 这是一个初学者记录自己学习reactjs进程的博客
- ffmpeg库使用及其错误解决
- 插入节点appendChild