Block作为返回值时的使用
昨天使用一个小例子简单说明了下Block作为参数时的使用。
今天再来复习一下Block作为返回值使用时的情况,先贴一小段热门第三方框架Masonry的官方sample code:
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
其中关于...equalTo(superview).....insets(padding)
之前没接触过这类用法的童鞋,可能看到这行代码就瞬间一脸懵逼了(挖槽(⊙□⊙) ,点语法接括号参数再接点语法是什么鬼,我Object-C读的少不要骗我...)。
淡定,还记得block的基本用法吗block(参数),其实这里就是使用了Block用作了方法的返回值,同时在Block里面又返回了self自身而形成了一个链式结构。这样说有些抽象,我们还是以昨天那个CalculatorManager工具类为例。
版本1.0
首先,我们先在工具类中实现一个很简单的方法:外界传递一个整形参数,然后将其与原结果值相加,再保存起来作为新的结果值。
CalculatorManager.h文件
#import <Foundation/Foundation.h>
@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这类型的用法在理解上抱有疑惑的话,希望这个小例子能帮到您:)
Block作为返回值时的使用的更多相关文章
- JsonResult作为Action返回值时的错误
JsonResult作为Action返回值时的错误 System.InvalidOperationException: This request has been blocked because ...
- Java学习笔记14---this作为返回值时返回的是什么
有时会遇到this作为返回值的情况,那么此时返回的到底是什么呢? 返回的是调用this所处方法的那个对象的引用,读起来有点绕口哈,有没有想起小学语文分析句子成份的试题,哈哈. 一点点分析的话,主干是& ...
- ajax当有返回值时
当ajax方法里面有return 值时,无法使用两种精简版的只能使用经典版 因为ajax 方法时异步的,正确的方式时使用经典版中async:false 设置为同步 默认为true 是异步 正确代码如 ...
- oracle 写存储过程有返回值时 注意在loop循环处添加返回值:=
例子: create or replace procedure p_xl is v_count NUMBER(10); begin for rs in(select yhbh from dbyh) l ...
- block之---应用场景:做参数和返回值
1.做参数 什么时候使用Block充当参数? 封装一个功能,这个功能做什么事情由外界决定,但是什么时候调用由内部决定,这时候就需要把Block充当参数去使用. 模拟需求: 封装一个计算器,怎么计算由外 ...
- iOS用三种途径实现一方法有多个返回值
以前觉得这种标题有点偏向于理论,实际开发中怎么会有这种诡异的需求,但是真正遇到了这种硬需求时觉得还是有那么点价值的,理论付诸了实践在此也就做了个整理. 以我私下开发中的一处代码为例,本意是希望有这么一 ...
- HttpClient调用doGet、doPost、JSON传参及获得返回值
调用 doPost:map传参 Map<String,Object> map = new HashMap<>(); map.put("test"," ...
- main 返回值
int main() 在c中表示返回值时int:也可以不明确给出返回值,默认为int:()表示接受任何参数,main(void)表示不接受任何参数.main(),int main(),main(voi ...
- shell调用函数返回值深入分析
编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢? 首先shell中调用函数有两种方式: 第一种:value=`functi ...
随机推荐
- JUnit小记
一.参数测试 /** * 1.更改测试运行器为RunWith(Parameterized.class) * 2.声明变量用来存放预期值与结果值 * 3.为测试类声明一个带有参数的公共构造方法,并在其中 ...
- linux 环境 tomcat 莫名奇妙挂掉
::-exec-] org.apache.coyote.http11.Http11Processor.service Error processing request java.lang.NullPo ...
- shell学习之路(整理ing)
学习 shell脚本之前的基础知识 http://www.92csz.com/study/linux/12.htm SHELL 脚本 http://www.92csz.com/study/linux/ ...
- sql server 作业没跑、开启sql 代理服务、新建作业
sql server 数据库中设置了晚上跑的作业,以前没注意,后来换了服务器建了新的虚拟机后第二天发现作业没跑. 主动执行作业可以实现目的,但是他不会自动执行,那么问题来了,为啥呢? 没有开启SQL ...
- Less-css基础扩展
//扩展Extend less的伪类,合并了选择器,放在与它引用匹配的选择器上 Use Method:以在study上扩展test的样式为例 .test{ color:#000000; font-si ...
- delphi =------报错
关于delphi软件运行出现Invalid floating point operation的错误的解决办法 关于delphi软件运行出现Invalid floating point operatio ...
- Java 其他对象的 API
System 类 (java.lang 包下) 该类中的方法和属性都是静态的. 常见方法 // 1, 获取当前时间的毫秒值 long currentTimeMillis(); // 2, 获取系统的属 ...
- python基础之类的封装
从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 一 封装什么 你钱包的有多少钱(数据的封装) 你的性取向( ...
- ps如果换背景
一.魔棒工具 魔棒工具主要是使用户可以选择颜色一致的区域(例如,一朵红花)或者背景比较单调的图片,而不必跟踪其轮廓.魔棒工具选择的颜色范围可以由工具选项栏中的误差范围 参数值来控制. 二.钢笔工具 路 ...
- tornado项目下路由系统的使用?
路由系统 在web框架中,路由表中的任意一项是一个元组,每个元组包含pattern(模式)和handler(处理器).当httpserver接收到一个http请求,server从接收到的请求中解析出u ...