接下來的部分摘自:最快讓你上手之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, 研究神的同窗能夠繼續分享它的更詳細的思路。
關於鏈式編程,我但願沒接觸過的同窗之後封裝相似的類時,能夠朝着這方向思考,少走彎路,謝謝!