iOS Developer首页投稿(暂停使用,暂停投稿)iOS Developer

iOS链式语法的实现

2016-09-14  本文已影响926人  Jinfei_Chen

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

[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]

上一篇下一篇

猜你喜欢

热点阅读