使用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. HDU4635

    /* 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边, 那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是, 同时X部中每个点到Y部的每个点都有一条边,假设X部有 ...

  2. Spring 之通过 Java 代码装配 bean

    [关于IoC的几点认识] 1.面向接口编程 --> 每层只向上层提供接口 2.inversion of control (IoC)  -->参考百度百科 3.DI是IoC的一种实现方式 [ ...

  3. PHP-FPM 慢执行日志、网站隔离配置

    慢执行日志 1.配置文件下打开慢执行日志 vim /usr/local/php/etc/php-fpm.conf # 慢执行日志路径 slowlog = /path/to/slow.log # 设置超 ...

  4. Linux系统下配置squid代理服务器的过程详解

    简单记录一下Squid透明代理服务器的配置 环境:VirtualBox + CentOS 6.0 + squid-3.1.4-1.el6.i686 0.检查squid是否默认安装,没有安装的先安装 [ ...

  5. 防盗链&CSRF&API接口幂等性设计

    防盗链技术 CSRF(模拟请求) 分析防止伪造Token请求攻击 互联网API接口幂等性设计 忘记密码漏洞分析 1.Http请求防盗链 什么是防盗链 比如A网站有一张图片,被B网站直接通过img标签属 ...

  6. 关于iOS开发的学习

    关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...

  7. zip无法解压

    使用unzip解压,提示 [root@iZ28g3behi3Z html]# unzip /var/www/html/deyizhonggong.zipArchive:  /var/www/html/ ...

  8. 记一次Configured Capacity: 0 (0 B)的解决

    场景 最近hadoop集群新加了一个节点N,通过Ambari管理 一切正常. 过了两天发现,虽然集群每天要进几个G的数据(共8个节点),但节点N占用空间丝毫没有变化,显然没有进数据啊 日志 查看该节点 ...

  9. easyui扩展数据表格点击加号拓展

    $(function(){ $("#RepaymentInfoTab").datagrid({ view: detailview, detailFormatter:function ...

  10. activity启动模式之singleTop

    activity启动模式之singleTop 一.简介 二.设置方法 在AndroidManifest.xml中将要设置为singleTop启动模式的页面进行配置 <activity andro ...