文档章节

【iOS编程思想】链式编程

魔笛GNR
 魔笛GNR
发布于 2016/07/25 16:25
字数 746
阅读 53
收藏 0

先看个例子 - Masonry(布局框架)

Masonry简介:Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 而且同时支持 iOS 和 Max OS X。

先来看看Masonry一个使用的小例子:

// ------- Masonry -------

// 创建控件
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];

// 设置控件的约束
[redView mas_makeConstraints:^(MASConstraintMaker *make) {
    
    // 存放redView设置约束的代码
    make.left.top.equalTo(@10);
    make.right.bottom.equalTo(@-10);
    
}];

Masonry实现原理:

首先,给所有UIView提供一个设置约束的方法makeConstraints

makeConstraints的实现方法:

1.   创建约束制造者,约束制造者提供了很多设置约束的方法,每个制造约束(equalTo)的方法,方法不需要参数,但是必须返回block,每个block需要传入一个参数,计算值。

**2.   ** 把约束制造者传入block中,block用于把所有的约束保存到约束制造者中。

**然后,**执行block。

**最后,**利用约束制造者给view一次性添加所有约束。

例子中实现的是redView距离屏幕边距 10 。运行效果如下:

实践出真知 - 计算器

我们模仿Masonry,设计一个计算器,仿照它的编程思想,每一个操作都返回一个block:

**首先,**给所有类提供一个方法makeCaculator。

**第二步,**创建计算制造者,计算制造者提供很多计算方法(加减乘除),每个计算方法不需要参数,但必须返回block,每个block需要传入一个参数,计算。

**第三步,**传入block,用于把所有计算保存到计算制造这种,执行block。

**最后,**把计算制造者算的值,返回出去。

先来看看makeCaculator的实现:

@interface CaculatorMaker : NSObject

@property (nonatomic, assign) int result;

//加法
- (CaculatorMaker *(^)(int))add;
- (CaculatorMaker *(^)(int))sub;
- (CaculatorMaker *(^)(int))muilt;
- (CaculatorMaker *(^)(int))divide;

@end

实现计算制造者:


@implementation CaculatorMaker

- (CaculatorMaker *(^)(int))add{
    
    return ^CaculatorMaker *(int value) {
        
        self.result += value;
        
        return self;
    };
}

- (CaculatorMaker *(^)(int))muilt{
    
    return ^CaculatorMaker *(int value) {
        
        self.result *= value;
        
        return self;
    };
}

- (CaculatorMaker *(^)(int))sub{
    
    return ^CaculatorMaker *(int value) {
        
        self.result -= value;
        
        return self;
    };
}

- (CaculatorMaker *(^)(int))divide{
    
    return ^CaculatorMaker *(int value) {
        
        self.result /= value;
        
        return self;
    };
}

@end

给NSObject添加一个拓展方法( "NSObject+Caculator.h"):

@interface NSObject(Caculator)

//计算
+ (int)makeCaculator:(void(^)(CaculatorMaker * maker))caculatorMaker;

@end

实现方法:

@implementation NSObject(Caculator)

+ (int)makeCaculator:(void (^)(CaculatorMaker *))caculatorMaker{
    
    CaculatorMaker * maker = [[CaculatorMaker alloc]init];
    
    caculatorMaker(maker);
    
    return maker.result;
}

@end

设计好了之后,我们来算一个数学计算题( (1 + 2 + 3 + 4) / 5):

// ------- 计算器 -------
    
//(1 + 2 + 3 + 4) * 5
int result = [NSObject makeCaculator:^(CaculatorMaker *maker) {
       
    maker.add(1).add(2).add(3).add(4).muilt(5);
        
}];
    
NSLog(@"(1 + 2 + 3 + 4) * 5 = %d",result);

结果是 :

至此,我们了解了链式编程思想,小伙伴们快动手试试吧!

Demo地址:

https://github.com/ly918/Demos

© 著作权归作者所有

共有 人打赏支持
魔笛GNR
粉丝 7
博文 82
码字总数 43485
作品 0
郑州
iOS工程师
私信 提问
IOS学习,最简单的表格应用程序,学习,列出博客

IOS编程浅蓝教程,这是博客地址http://www.cnblogs.com/haichao/category/425378.html IOS编程浅蓝教程:锲子 IOS编程浅蓝教程(一)先决条件:开始iOS编程的必要准备 IOS编程浅蓝教程(二) Hel...

andy521zhu
2015/01/17
0
0
EasyIOS 2.0 发布,基于 MVVM 的 IOS 开发框架

全新基于MVVM(Model-View-ViewModel)编程模式架构,开启EasyIOS开发函数式编程新篇章。 EasyIOS 2.0类似AngularJs,最为核心的是:MVVM、ORM、模块化、自动化双向数据绑定、等等 关于有疑问什...

墨水
2014/07/30
9.7K
9
开发iOS应用程序需要的工具和编程技术

似乎每个iOS应用开发学习者都是从这篇文章开始写博客的,我也不例外,也从这里写吧,内容雷同,但绝对是原创。因为一直相信,通过自己的理解写出来,是掌握技术一个很好的途径。 Xcode 苹果最...

鉴客
2012/01/09
4.7K
0
EasyIOS 2.1 发布,优化网络请求与ORM操作

EasyIOS 2.1发布 此版本相较2.0更新内容如下: 1.优化ORM操作 ,丰富数据库查询方法 2.修改网络请求,选用大家熟悉的AFNetworking 移除 MKNetWorkKit 3.增加正则表达式操作类 4.集成更加友好...

墨水
2014/09/12
2.9K
0
一、Objective-C概述

说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略...

长平狐
2013/03/28
128
0

没有更多内容

加载失败,请刷新页面

加载更多

关于php的xdebug配置(编辑器vscode)

虽然说echo和print_r是公认的最实用的调试工具,但是效率真的没有可视化的直接断点那么高。这里简单介绍如果安装及配置xdebug for vscode 一、PHP环境处的配置 1、编译安装 下载及编译php,因...

元谷
32分钟前
7
0
heartbeat

http://www.linux-ha.org/doc/users-guide/_building_and_installing_heartbeat_from_source.html kaer@linux-sqlf:~/Reusable-Cluster-Components-glue--0a7add1d9996> ./configure --enabl......

李有常
42分钟前
1
0
shell 脚本 title 免写入

1、有时候写脚本,需要写一些注释信息或者备注之类,当每次都手写比较麻烦,可以写一个脚本,每次运行则自动写入这些信息,不需要在手动输入; 通过 EOF 嵌入文档的方式; [root@localhost_002 sh...

芬野de博客
49分钟前
3
0
FragmentPagerAdapter+ViewPager 更新问题

场景 存在一种需求,当用户系统中,属于某一组织的用户登录之后(或者账户切换),要求主页面显示不同的ViewPager + Fragment组合,并且要求app无需退出就能刷新组合以及组合中的页面。 此外...

IamOkay
49分钟前
3
0
Python有哪些常用的标准库?Python基础教程,第十一讲,常用标准库(一)

上一节课我们学习了如何自定义模块,大家可以定义自己的模块,但是项目中通常不允许我们自己造轮子,所以本节课主要学习Python的标准库,学习使用别人的轮子,由于标准库内容较多,所以我们分...

程序员补给栈
58分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部