zoukankan      html  css  js  c++  java
  • 模仿Masonry链式编程思想

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

  • 相关阅读:
    HDU 6106 Classes【水题】
    HDU 6106 Classes【水题】
    ACM常用解题技巧方法
    ACM常用解题技巧方法
    程序员语录
    数据库设计的三大范式
    IDEA中Java代码存入DB中为乱码
    IDEA中如何添加jar包
    Java的Protected
    Hibernate JPA 如何使用SQL文直接查询
  • 原文地址:https://www.cnblogs.com/kingbo/p/6477941.html
Copyright © 2011-2022 走看看