博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Block作为返回值时的使用
阅读量:5342 次
发布时间:2019-06-15

本文共 2135 字,大约阅读时间需要 7 分钟。

昨天使用一个小例子简单说明了下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 
@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这类型的用法在理解上抱有疑惑的话,希望这个小例子能帮到您:)

转载于:https://www.cnblogs.com/ShaRuru/p/5152443.html

你可能感兴趣的文章
Code Snippet
查看>>
Node.js Express项目搭建
查看>>
zoj 1232 Adventure of Super Mario
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
web.xml 中加载顺序
查看>>
pycharm激活地址
查看>>