昨天使用一个小例子简单说明了下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作为返回值时的使用的更多相关文章

  1. JsonResult作为Action返回值时的错误

    JsonResult作为Action返回值时的错误   System.InvalidOperationException: This request has been blocked because ...

  2. Java学习笔记14---this作为返回值时返回的是什么

    有时会遇到this作为返回值的情况,那么此时返回的到底是什么呢? 返回的是调用this所处方法的那个对象的引用,读起来有点绕口哈,有没有想起小学语文分析句子成份的试题,哈哈. 一点点分析的话,主干是& ...

  3. ajax当有返回值时

    当ajax方法里面有return 值时,无法使用两种精简版的只能使用经典版 因为ajax 方法时异步的,正确的方式时使用经典版中async:false 设置为同步 默认为true  是异步 正确代码如 ...

  4. oracle 写存储过程有返回值时 注意在loop循环处添加返回值:=

    例子: create or replace procedure p_xl is v_count NUMBER(10); begin for rs in(select yhbh from dbyh) l ...

  5. block之---应用场景:做参数和返回值

    1.做参数 什么时候使用Block充当参数? 封装一个功能,这个功能做什么事情由外界决定,但是什么时候调用由内部决定,这时候就需要把Block充当参数去使用. 模拟需求: 封装一个计算器,怎么计算由外 ...

  6. iOS用三种途径实现一方法有多个返回值

    以前觉得这种标题有点偏向于理论,实际开发中怎么会有这种诡异的需求,但是真正遇到了这种硬需求时觉得还是有那么点价值的,理论付诸了实践在此也就做了个整理. 以我私下开发中的一处代码为例,本意是希望有这么一 ...

  7. HttpClient调用doGet、doPost、JSON传参及获得返回值

    调用 doPost:map传参 Map<String,Object> map = new HashMap<>(); map.put("test"," ...

  8. main 返回值

    int main() 在c中表示返回值时int:也可以不明确给出返回值,默认为int:()表示接受任何参数,main(void)表示不接受任何参数.main(),int main(),main(voi ...

  9. shell调用函数返回值深入分析

    编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢? 首先shell中调用函数有两种方式: 第一种:value=`functi ...

随机推荐

  1. Learning to Compare: Relation Network 源码调试

    CVPR 2018 的一篇少样本学习论文 Learning to Compare: Relation Network for Few-Shot Learning 源码地址:https://github ...

  2. ng-template

    一,锚点链接 定义锚点: <a href="#login" class="btn btn-primary">Login</a> < ...

  3. mac同时安装多个jdk

    DK8 GA之后,小伙伴们喜大普奔,纷纷跃跃欲试,想体验一下Java8的Lambda等新特性,可是目前Java企业级应用的主打版本还是JDK6, JDK7.因此,我需要在我的电脑上同时有JDK8,JD ...

  4. 手动爬虫之流程笔记1(python3)

    一.引入拓展库 由于刚刚起步学习爬虫,故从urllib库开始 首先引入urllib,这里主要用到urllib中request类 import urllib.request as ur 二.设置全局参数 ...

  5. IntelliJ IDEA 工具技巧

    IntelliJ IDEA 工具技巧 以下都是自己积累的IntelliJ IDEA 使用技巧,比较零碎,观看不便之处还望海涵,如有错误之处还望指正 自己常用,不懂的可以加群询问:244930845 S ...

  6. 并发编程7 管道&事件&信号量&进程池(同步和异步方法)

    1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...

  7. kafka_2.11-0.10.1.1集群搭建安装配置

    在搭建kafka集群之前,请保证zookeeper已安装. 1.下载 官网下载链接:http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/0.10.1.1/ ...

  8. mysql 获取id最大值

    数据库表中id列不为自动增加,需要程序来增加id的SQL SELECTCASE IFNULL(MAX(id),1)WHEN 1 THEN 1ELSE MAX(id) + 1END AS newmaxi ...

  9. 解决 pip 安装opendr包 卡住的问题

    使用豆瓣的源(已经确认过了该源中有opendr包),pip安装opendr,结果卡在了下载完成的位置,什么提示也没有.(如下图) 既然安装包已经下载下来了又安装不上,则应该是安装代码中有什么问题,只不 ...

  10. 百度 验证码识别API 使用

    先到百度云申请文字识别API ,会给你一个API KEY和一个SECRET KEY,免费,一天最多500次请求. try: temp_url = 'https://aip.baidubce.com/o ...