模仿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]; 很像啊
模仿Masonry链式编程思想的更多相关文章
- Objective-C 链式编程思想
链式编程思想 链式编程是什么 链式编程就是将调用多个方法用点语法连接起来,让代码更加简洁和可读性更高刚开始接触链式编程是Masonry,用起来真的非常爽 1 make.left.right.top.e ...
- iOS 开发之使用链式编程思想实现简单的计算器
链式编程思想是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.例如 a(1).b(2).c(3). 链式编程思想最为关键的是,方法的返回值是block,block必须返回对 ...
- ios的链式编程笔记
1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数 > 链式编程思想 2. 使用block当函数的返回参数 // 之前开发中比较习惯 ...
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- 第四十一篇、Masonry利用Block实现链式编程
一直都觉得使用Masonry的时候语法特别优雅,很早的时候就想尝试下怎么实现, 一直都没弄明白,直到最近看见一篇叫block实现链式编程的 1.方法的返回类型是代码块 >代码块的返回类型是该类的 ...
- iOS 链式编程探索(Masonry)
看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...
- [Objective-C]用Block实现链式编程
看这篇博客时最快让你上手ReactiveCocoa之基础篇看到作者介绍链式编程那一块,发现自己的钻研精神不足.想想自己使用链式编程也有段时间了,对,就是 Masonry 库.自己一直享受点语法带来的效 ...
- 实现iOS中的链式编程
谈到链式编程,那Masonry几乎就是最经典的代表.如: make.top.equalTo(self.view).offset() 像这样top.equalTo(self.view).offset(6 ...
- iOS端JSON转Model链式编程框架SuperKVC使用方法与原理
背景 在client编程中.字典转模型是一个极为常见的问题,苹果提供了KVC来实现NSDictionary到Model的注入,可是KVC仅仅能进行单层浅注入.且无法处理类型转换.key与属性名不正确应 ...
随机推荐
- Spark机器学习1·编程入门(scala/java/python)
Spark安装目录 /Users/erichan/Garden/spark-1.4.0-bin-hadoop2.6 基本测试 ./bin/run-example org.apache.spark.ex ...
- 20145201 《Java程序设计》第一周学习总结
# 20145201 <Java程序设计>第一周学习总结 ## 教材学习内容总结 万事开头难,终于开始学习了Java.寒假的时候看到老师的要求确实有点慌,但是这周翻开书,从书本知识第一行学 ...
- DevExpress组件之——TreeList组件
由于是第一次接触到第三方控件DevExpress中的TreeList,对其进行了进一步的研究,采用递归算法实现.做下自己熟悉第三方控件的整个过程,为和我一样处理于起步阶段的同仁们提供个参考,以下为最终 ...
- LeetCode第[19]题(Java):Remove Nth Node From End of List(删除链表的倒数第N个节点)
题目:删除链表的倒数第N个节点 难度:Medium 题目内容: Given a linked list, remove the n-th node from the end of list and r ...
- RadioButton实现多选一
RadioButton实现多选一 一.简介 二.RadioButton实现多选一方法 1.将多个RadioButton放在一个RadioGroup里面 <RadioGroup android:i ...
- Django进阶Admin篇 - admin基本配置
django admin 是django自带的一个后台app,提供了后台的管理功能. 基础知识点: 一.认识ModelAdmin 管理界面的定制类,如需扩展特定的model界面,需要从该类继承 二.注 ...
- 八 web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用
使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener()初始化IPinstall_opener()将代理IP设置成全 ...
- mysql的bin或者sbin目录可执行文件
一. mysql服务和myql服务启动程序 1. mysqld mysqld就是mysql server,负责管理对mysql数据的访问. 当mysql server启动后,它会监听来自客户端的网络连 ...
- 使用Spring实现MySQL读写分离
1. 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很自然的思路是使用一主多从的数据库集 ...
- Prism5.0新内容(纯汉语版)
Prism 5.0 包含很多新东西,新的快速入门示例,新的范例,更新的文档,Prism类库代码的改变.用来解决已有问题,回应社区所提的需求.(这句话跟 What's New in Prism Libr ...