接下来的部分摘自:最快让你上手之ReactiveCocoa基础篇编程
先简单介绍下目前我们已知的编程思想。框架
1 面向过程:处理事情以过程为核心,一步一步的实现。ide
2 面向对象:万物皆对象函数式编程
3 链式编程思想:是将多个操做(多行代码)经过点号(.)连接在一块儿成为一句代码,使代码可读性好。a(1).b(2).c(3)函数
链式编程特色:方法的返回值是block,block必须有返回值(自己对象),block参数(须要操做的值)ui
表明:Masonry框架。atom
4 响应式编程思想:不须要考虑调用顺序,只须要知道考虑结果,相似于蝴蝶效应,产生一个事件,会影响不少东西,这些事件像流同样的传播出去,而后影响结果,借用面向对象的一句话,万物皆是流。对象
表明:KVO运用。事件
5 函数式编程思想:是把操做尽可能写成一系列嵌套的函数或者方法调用。get
函数式编程特色:每一个方法必须有返回值(自己对象),把函数或者Block当作参数,block参数(须要操做的值)block返回值(操做结果)
表明:ReactiveCocoa。
用函数式编程实现,写一个加法计算器,而且加法计算器自带判断是否等于某个值.
咱们这里以链式编程思想代码实现一个计算器:
#import
@class CaculatorMaker;
@interface NSObject (CaculatorMaker)
//计算
+ (int)makeCaculators:(void(^)(CaculatorMaker *make))caculatorMaker;
@end
#import "NSObject+CaculatorMaker.h"
#import "CaculatorMaker.h"
@implementation NSObject (CaculatorMaker)
//计算
+ (int)makeCaculators:(void(^)(CaculatorMaker *make))block
{
CaculatorMaker *mgr = [[CaculatorMaker alloc] init];
block(mgr);
return mgr.iResult;
}
@end
#import
@interface CaculatorMaker : NSObject
@property (nonatomic, assign) int iResult;
//加法
- (CaculatorMaker *(^)(int))add;
//减法
- (CaculatorMaker *(^)(int))sub;
//乘法
- (CaculatorMaker *(^)(int))muilt;
//除法
- (CaculatorMaker *(^)(int))divide;
@end
#import "CaculatorMaker.h"
@implementation CaculatorMaker
- (CaculatorMaker *(^)(int))add
{
return ^(int value)
{
_iResult += value;
return self;
};
}
@end
调用:
int iResult = [NSObject makeCaculators:^(CaculatorMaker *make) {
make.add(1).add(2).add(3).divide(2);
}];
分析下这个方法执行过程:
第一步:NSObject 建立了一个block, 这个block里建立了一个CaculatorMaker对象make,并返回出来
第二步:这个对象make调用方法add时,里面持有的属性iResult作了一个加法,而且返回本身,以即可以接下去继续调用方法。
这就是链式编程思想的一个很小但很明了的例子。
如今咱们以 Masonry 举例:
咱们看看Masonry的
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
return [constraintMaker install];
}
是否是跟咱们的计算器的类别一个样?????
咱们再来看看它的
- (MASConstraint * (^)(id attr))mas_equalTo;
- (MASConstraint * (^)(id))mas_equalTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
};
}
看看它的self.equalToWithRelation实现:
- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation {
return ^id(id attribute, NSLayoutRelation relation) {
if ([attribute isKindOfClass:NSArray.class]) {
NSAssert(!self.hasLayoutRelation, @"Redefinition of constraint relation");
NSMutableArray *children = NSMutableArray.new;
for (id attr in attribute) {
MASViewConstraint *viewConstraint = [self copy];
viewConstraint.secondViewAttribute = attr;
[children addObject:viewConstraint];
}
MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children];
compositeConstraint.delegate = self.delegate;
[self.delegate constraint:self shouldBeReplacedWithConstraint:compositeConstraint];
return compositeConstraint;
} else {
NSAssert(!self.hasLayoutRelation || self.layoutRelation == relation && [attribute isKindOfClass:NSValue.class], @"Redefinition of constraint relation");
self.layoutRelation = relation;
self.secondViewAttribute = attribute;
return self;
}
};
}
的确是返回本身,因此这正是它的链式编程思想的体现。
因为本人没有继续研究Masonry, 研究神的同窗能够继续分享它的更详细的思路。
关于链式编程,我但愿没接触过的同窗之后封装相似的类时,能够朝着这方向思考,少走弯路,谢谢!