iOS开发我们就爱程序媛小知识点

Masonry源码——准备知识

2017-08-04  本文已影响508人  郑明明

Masonry是一个用于布局的轻量级开源框架,我们一般使用它来代替苹果原生的AutoLayout代码,使得代码更加舒适简洁。Masonry框架虽然很轻量,但是代码中使用了大量的block和链式编程的技巧,所以想要阅读Masonry框架源码,需要掌握这两方面的知识

Block的常见使用

    int (^test)(int) = ^(int a) {
        return a + 1;
    };
- (void)test :(void (^)(NSString *a)) block {
    
}
- (void (^)(NSString *))block {
    return ^(NSString *a) {
        NSLog(@"%@",a);
    };
}

有时候我们也可以使用typedef来简化block

typedef void(^block)(NSString *a);

- (block)block {
    return ^(NSString *a) {
        NSLog(@"%@",a);
    };
}

- (void)test :(block) block {
    
}

链式编程思想

很多地方总会将链式编程和函数式编程结合在一起来谈论,这里先简单说明下两者的区别

method1(method2(method3(3)));
make.top.equalTo(self.view).with.offset(5);

接着我们来看链式编程是如何实现的
还是用一个最经典的例子来看,那就是计算器,我们先来看看整体的代码,再逐步分析

@property (nonatomic, assign) NSInteger result;

+ (NSInteger)makeCalculator :(void(^)(Calculator * make)) block;

- (Calculator * (^) (NSInteger))add;
- (Calculator * (^) (NSInteger))sub;
- (Calculator *)printResult;
+ (NSInteger)makeCalculator:(void (^)(Calculator * make))block {
    Calculator *calculator = [[Calculator alloc]init];
    block(calculator);
    return calculator.result;
}

- (Calculator *(^)(NSInteger))add {
    return ^(NSInteger temp) {
        self.result += temp;
        return self;
    };
}

- (Calculator *(^)(NSInteger))sub {
    return ^(NSInteger temp) {
        self.result -= temp;
        return self;
    };
}

- (Calculator *)printResult {
    NSLog(@"%ld",(long)self.result);
    return self;
}
    [Calculator makeCalculator:^(Calculator *make) {
        make.add(2).sub(1).printResult.sub(3);
    }];

看.h文件,有一个result成员属性来存储结果,方法大致分为了三种

在看使用的代码

上一篇 下一篇

猜你喜欢

热点阅读