模仿Masonry链式编程思想

2023-04-25,,

  使用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]; 很像啊

模仿Masonry链式编程思想的相关教程结束。

《模仿Masonry链式编程思想.doc》

下载本文的Word格式文档,以方便收藏与打印。