美文网首页
iOS链式编程

iOS链式编程

作者: 炒河粉儿 | 来源:发表于2019-08-06 13:25 被阅读0次

    前言

    通过对Masonry的学习,我们了解了链式编程的思想。此片文章是使用链式编程的思想做一个计算机,练习一下链式编程。

    思考

    链式编程的核心思想就是把想要做的事封装到block里面,给外界提供一个返回这个block的方法。
    书写方式为返回值是一个block,block的参数放需要操作的对象或者其他内容,block的返回值是当前对象(方法调用者)

    代码实现

    //新建一个CaculatorMaker类作为计算机类。
    
    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface CaculatorMaker : NSObject
    
    @property (nonatomic, assign) int result;
    
    - (CaculatorMaker *(^)(int))add;
    
    - (CaculatorMaker *(^)(int))sub;
    
    - (CaculatorMaker *(^)(int))mul;
    
    - (CaculatorMaker *(^)(int))divide;
    
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    #import "CaculatorMaker.h"
    
    @implementation CaculatorMaker
    
    - (CaculatorMaker *(^)(int))add
    {
        __weak typeof(self) weakSelf = self;
        return ^(int num) {
            weakSelf.result += num;
            return self;
        };
        
    }
    
    - (CaculatorMaker *(^)(int))sub
    {
        __weak typeof(self) weakSelf = self;
        return ^(int num) {
            weakSelf.result -= num;
            return self;
        };
        
    }
    
    - (CaculatorMaker *(^)(int))mul
    {
        __weak typeof(self) weakSelf = self;
        return ^(int num) {
            weakSelf.result = num * weakSelf.result;
            return self;
        };
        
    }
    
    - (CaculatorMaker *(^)(int))divide
    {
        __weak typeof(self) weakSelf = self;
        return ^(int num) {
            weakSelf.result = weakSelf.result/num;
            return self;
        };
        
    }
    
    @end
    
    

    由于每个方法的返回值都是一个block,外部调用方法传入block需要的参数调用block。block执行后,block的返回值又是当前对象本身,就可以实现继续使用点语法去继续调用方法的效果。

    CaculatorMaker *maker = [[CaculatorMaker alloc]init];
    maker.add(10).add(20);
    NSLog(@"%d",maker.result);
    

    Masonry的调用方法,外部提供一个block为参数的方法,将一系列的操作都写到block代码块中,使代码高聚合。因此我们也借鉴这种思想,再给这个计算机类添加一个类方法。

    + (int)caculatorTest:(void (^)(CaculatorMaker *))caculatorMakerBlock;
    
    + (int)caculatorTest:(void (^)(CaculatorMaker *))caculatorMakerBlock
    {
        CaculatorMaker *maker = [[CaculatorMaker alloc]init];
        caculatorMakerBlock(maker);
        return maker.result;
    }
    

    写一个类方法,这个方法的返回值为计算结果,参数为一个block,block的参数是计算机对象,方法中先创建一个计算机对象,将计算机对象作为参数传入到block中,并同时调用这个block,返回值为计算机对象的最终结果。

        int result = [CaculatorMaker caculatorTest:^(CaculatorMaker *maker) {
            maker.add(5).add(100).mul(2).sub(10).divide(5);
        }];
        NSLog(@"%d",result);
    

    外部调用该方法的时候,block块中的代码就会被执行,计算最终结果。计算完毕后,将结果返回。

    相关文章

      网友评论

          本文标题:iOS链式编程

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