何為鏈?zhǔn)骄幊棠绰e個例子說明
make.top.equalTo(self.view).and.offset(100);
像這樣make.top.equalTo(self.view).and.offset(100通過”.”語法奏司,將需要執(zhí)行的代碼塊連續(xù)的書寫下去,就是鏈?zhǔn)骄幊獭O襁@樣equalTo(self.view)通過’()’去調(diào)用函數(shù),一般調(diào)用完返回的還是這個對象本身,就是函數(shù)式編程樟插。
實現(xiàn)鏈?zhǔn)骄幊痰年P(guān)鍵就是聲明一個block的屬性韵洋,而這個block返回值是一個對象(根據(jù)業(yè)務(wù)需求不同,可以返回的是這個對象實例本身黄锤,也可以是這個類的另一個實例)搪缨,而block中內(nèi)部的邏輯就是項目的業(yè)務(wù)邏輯。
例子:
@interface CaculatorMaker : NSObject
@property (nonatomic, assign) int result;
- (void)add:(int)a;
- (void)sub:(int)a;
@implementation CaculatorMaker
- (void)add:(int)a{
_result += a;
}
- (void)sub:(int)a{
_result -= a;
}
@end
CaculatorMaker *maker = [[CaculatorMaker alloc]init];
[maker add:10];
[maker sub:2];
int result = maker.result;
NSLog(@“得到的結(jié)果為%d”,result); //8
也許我們那大部分都會這么寫的吧鸵熟,但想一想能否再把代碼精簡一些呢
比如
int result = [[maker add:10] sub:2].result;
那只得修改代碼了
- (CaculatorMaker *)add:(int)a{
_result += a;
return self;
}
- (CaculatorMaker *)sub:(int)a{
_result -= a;
return self;
}
好了副编,到了這一步是不是感覺很像鏈?zhǔn)骄幊塘四?br>
我們再試著能不能改成 maker.add(10).sub(2).result
呢
我們分析可以得出,既然用到了“點”語法,那add(10)必然是maker上的“”屬性“”流强,并可以返回maker對象痹届,然后在調(diào)用此“屬性”,再返回maker對象打月,那么此“屬性”是什么呢队腐,就是block了
所以我們可以改成這樣
在.h上定義
- (CaculatorMaker *(^)(int))add;
- (CaculatorMaker *(^)(int))sub;
在.m實現(xiàn)
-(CaculatorMaker *(^)(int))add{
CaculatorMaker * (^block)(int) = ^(int value){
_result += value;
return self;
};
return block;
}
也可以簡寫成
- (CaculatorMaker *(^)(int))add{
return ^(int value){
_result += value;
return self;
};
}
- (CaculatorMaker *(^)(int))sub{
return ^(int value){
_result -= value;
return self;
};
}
此時就可以寫成
CaculatorMaker *maker = [[CaculatorMaker alloc]init];
int result = maker.add(10).sub(2).result;
NSLog(@“得到的結(jié)果為%d”,result); //8
是不是感覺代碼一下子簡潔多了呢