iOS链式语法的实现

作者: Jinfei_Chen | 来源:发表于2016-09-14 04:00 被阅读926次

    最近都失眠,干脆起床写博客!
    首先来看看一段代码:

    [self.view1 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(50);
            make.right.mas_equalTo(-50);
            make.top.mas_equalTo(50);
            make.bottom.mas_equalTo(-50);
        }];
    

    对,这个就是Objective-C的 点链式语法 ,本文就写写关于点链式语法的实现, 直接上代码:

    CalculatorTools.h

    @interface CalculatorTools : NSObject
    
    // 计算结果
    @property (nonatomic, assign) NSInteger result;
    
    // 加法
    - (CalculatorTools *(^)(NSInteger num)) add;
    // 减法
    - (CalculatorTools *(^)(NSInteger num)) minus;
    // 乘法
    - (CalculatorTools *(^)(NSInteger num)) multiply;
    // 除法
    - (CalculatorTools *(^)(NSInteger num)) divide; 
    
    @end
    

    CalculatorTools.m

    @implementation CalculatorTools
    
    - (instancetype) init 
    {
        self != [super init] ;
        if ( ! self )
        {
            return nil;
        }
        self.result = 0;
        return self;
    }
    
    - (CalculatorTools *(^)(NSInteger num)) add 
    {
        return ^id(NSInteger num){
            self.result += num;
            return self;
        };
    }
    
    - (CalculatorTools *(^)(NSInteger num)) minus
    {
        return ^id(NSInteger num){
             self.result -= num;
             return self;
        };
    }
    
    - (CalculatorTools *(^)(NSInteger num)) multiply
    {
        return ^id(NSInteger num){
            self.result *= num;
            return self;
        };
    }
    
    - (CalculatorTools *(^)(NSInteger num)) divide 
    {
        return ^id(NSInteger num){
            // 使用断言NSAssert()调试程序错误
            NSAssert(num != 0, @"除数不能为零");
            self.result /= num;
            return self;
        };
    }
    
    @end
    

    接下来就是调用 :

    CalculatorTools *cal = [[CalculatorTools alloc] init];
    cal.add(1).minus(2).multiply(3).divide(4);
    NSLog(@"result = %ld", cal.result);
    

    可以看出,都是一些对block的运用,在这些block中,返回值都是self本身,当调用的时候,流程是这样的:
    首先获得实例中的一个block,然后执行block并返回实例本身,然后再执行实例的另一个block,而在这个block中同样返回实例本身,按此规律通过点语法一直往下执行。
    就是这么简单,大家慢慢体会,本文有任何不足之处,欢迎大家不吝指教,一起探讨学习!

    参考:
    1、[使用断言NSAssert()调试程序错误][http://blog.sina.com.cn/s/blog_75992b660101kbj2.html]

    相关文章

      网友评论

        本文标题:iOS链式语法的实现

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