使用masonry 也将近一年多了,它的链式编程方式一直是很吸引我的。

  之前一直没空好好思考它是如何实现,直到现在正好自己有空,因此写下链式编程的基本思路。 链式基本的编程形式如

  a.property1(arg1).property2(arg2).property3(arg3);====> 对象.属性(参数1).属性(参数2).属性(参数2);其实将这个表达式放在我们的masonry代码中便很熟悉 ,如: make.left.equalTo(bootView).offset(10); (其中make 是MASConstraintMaker 对象);

   masonry它有个核心职责就是布局,因此所有对象的操作的基类都是UIView。 而MASConstraintMaker 对象实例化对象正是 [[MASConstraintMaker alloc] initWithView:(UIView 对象)]; 这样就可以对UIView 进行布局操作了。 因此归根结底,我们只要实现MASConstraintMaker 是 如何实现链式编程即可;

A:分解表达式 a.property1(arg1).property2(arg2).property3(arg3) 是如何工作的

     a.property1(arg1) 表示返回一个block : 这个block 的入参 是arg1 ,返回值是a对象本身;

   同理a.property2(arg2);和.property3(arg3)的block 也是如此

B:实现一个加减法链式表达式

#import <Foundation/Foundation.h>

@interface KBMakeCaculate : NSObject

@property(nonatomic,assign) NSInteger reuslt;

/**

 add 加

 */

-(KBMakeCaculate *(^)(NSInteger))add;

/**

 min 减

 */

-(KBMakeCaculate *(^)(NSInteger))min; 

@end

 

#import "KBMakeCaculate.h"

@implementation KBMakeCaculate

 

/**

 add

 */

-(KBMakeCaculate *(^)(NSInteger))add{

    return ^ KBMakeCaculate *(NSInteger value){

        _reuslt+=value;

        return self;

    };

}

 

/**

 min

 */

-(KBMakeCaculate *(^)(NSInteger))min{

    return ^ KBMakeCaculate *(NSInteger value){

        _reuslt -=value;

          return self;

    };

}

@end

简单调用案例:

KBMakeCaculate *maker = [KBMakeCaculate new];

maker.add(1).add(2).min(3);

maker.result; // 返回0

==========================利用NSObject 模仿UIView======================================

C:扩展NSObject(NSObject+Calculate)类模仿UIView 调用方式:

 

#import <Foundation/Foundation.h>

#import "KBMakeCaculateManager.h"

@interface NSObject (Calculate)

 

/**

 计算

 @param calculate 计算blokc

 @return 返回值

 */

-(NSInteger)makeCalculate:(void(^)(KBMakeCaculate*maker))calculate;

@end

 

 

#import "NSObject+Calculate.h"

@implementation NSObject (Calculate)

/**

 计算

 @param calculate 计算blokc

 @return 返回值

 */

-(NSInteger)makeCalculate:(void(^)(KBMakeCaculate* maker))calculate{

    //方法一

    KBMakeCaculate * maker = [KBMakeCaculate new];

    calculate(maker);

    

    return maker.reuslt;

//    //方法二

//    KBMakeCaculateManager *manager = [KBMakeCaculateManager new];

//    [manager makeCalculate:calculate];

//    

//    return manager.maker.reuslt;

}

@end

 

//调用案例:

NSObject *obj = [NSObject new];

NSInteger result = [obj makeCalculate:^(KBMakeCaculate *maker) { maker.add(1).add(1).add(2).min(10); }];

//看到里是不是觉得和[UIView mas_makeConstraints:(void(^)(MASConstraintMaker *make))block]; 很像啊