美文网首页ios开发
Block的高级用法(二) -- block作为返回值,链式编程

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

作者: 困惑困惑困惑 | 来源:发表于2018-10-11 16:46 被阅读7次

    相信用过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的参数。如图所示:


    20160918172821496.png

    仔细品味这个图示,相信你会明白的,如果还有疑问的,建议你好好复习下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
    
    
    

    .m

    + (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
    
    
    
    

    打印结果:

    20160918200215124.png
    打印结果正确,程序是正确的。我们主要在这里学习它的编程思想,用到了传说中的链式编程思想。
    原文链接:https://blog.csdn.net/qq_24904667/article/details/52575733?locationNum=7

    相关文章

      网友评论

        本文标题:Block的高级用法(二) -- block作为返回值,链式编程

        本文链接:https://www.haomeiwen.com/subject/pknbaftx.html