使用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链式编程思想的更多相关文章

  1. Objective-C 链式编程思想

    链式编程思想 链式编程是什么 链式编程就是将调用多个方法用点语法连接起来,让代码更加简洁和可读性更高刚开始接触链式编程是Masonry,用起来真的非常爽 1 make.left.right.top.e ...

  2. iOS 开发之使用链式编程思想实现简单的计算器

    链式编程思想是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.例如 a(1).b(2).c(3). 链式编程思想最为关键的是,方法的返回值是block,block必须返回对 ...

  3. ios的链式编程笔记

    1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数  > 链式编程思想 2. 使用block当函数的返回参数 // 之前开发中比较习惯 ...

  4. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

  5. 第四十一篇、Masonry利用Block实现链式编程

    一直都觉得使用Masonry的时候语法特别优雅,很早的时候就想尝试下怎么实现, 一直都没弄明白,直到最近看见一篇叫block实现链式编程的 1.方法的返回类型是代码块 >代码块的返回类型是该类的 ...

  6. iOS 链式编程探索(Masonry)

    看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...

  7. [Objective-C]用Block实现链式编程

    看这篇博客时最快让你上手ReactiveCocoa之基础篇看到作者介绍链式编程那一块,发现自己的钻研精神不足.想想自己使用链式编程也有段时间了,对,就是 Masonry 库.自己一直享受点语法带来的效 ...

  8. 实现iOS中的链式编程

    谈到链式编程,那Masonry几乎就是最经典的代表.如: make.top.equalTo(self.view).offset() 像这样top.equalTo(self.view).offset(6 ...

  9. iOS端JSON转Model链式编程框架SuperKVC使用方法与原理

    背景 在client编程中.字典转模型是一个极为常见的问题,苹果提供了KVC来实现NSDictionary到Model的注入,可是KVC仅仅能进行单层浅注入.且无法处理类型转换.key与属性名不正确应 ...

随机推荐

  1. 认识shiro

    shiro是安全(权限)框架,不仅可以在javase中也可以在javaee中 shiro可以完成认证.授权.加密.会话管理,与web进行集成.缓存等. Authentication:身份认证/登录,验 ...

  2. ICMP与PING解析

    1.ICMP格式 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消 ...

  3. MySQL Binlog解析(1)

    一.Binlog File Binlog files start with a Binlog File Header followed by a series of Binlog Event Binl ...

  4. Apache 错误整理

    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localho ...

  5. 什么时候需要用super

    1.子类构造函数调用父类构造函数用super 2.子类重写(覆盖)父类方法后,若想调用父类中被重写的方法,用super 3.未被重写的方法可以直接调用.

  6. Autofac is designed to track and dispose of resources for you.

    https://autofaccn.readthedocs.io/en/latest/best-practices/ Autofac is designed to track and dispose ...

  7. 对拷 使用scp命令在两台linux上对拷文件或者文件夹

    以前一直是在服务器上tar打包压缩,下载到本地电脑上,再上传到另外一台服务器上,再解压. 其实使用scp命令就可以直接对拷文件或者文件夹了. scp就是secure copy,是用来进行远程文件拷贝的 ...

  8. hibernate配置文件的详解

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE hibernate-configurati ...

  9. server_2003_r2_standard_sp2_vl_X13-46532

    1. 安装的是 cn_win_srv_2003_r2_standard_with_sp2_vl_cd1_X13-46532.iso CD2 它没有要求装 也就没装,貌似 网上搜到 安装CD2需要另外的 ...

  10. 深入浅出TensorFlow(二):TensorFlow解决MNIST问题入门

    2017年2月16日,Google正式对外发布Google TensorFlow 1.0版本,并保证本次的发布版本API接口完全满足生产环境稳定性要求.这是TensorFlow的一个重要里程碑,标志着 ...