場景?
實現(xiàn)連續(xù)加法運算 ?1 + 2 + 3 + 4.违施。。烦粒。
普通實現(xiàn)
-(NSInteger)addWithParam1:(NSInteger)param1 param2:(NSInteger)param2 param3:(NSInteger)param3{
? ? ? ? return param1 +param2 + param3;
}
如果有很多如此做法非常麻煩。
我們想實現(xiàn)如下效果的調(diào)用渡冻,類似于masonry,也就是所謂的鏈式編程忧便,看起來就十分高大上
int result = [NSObject makeAddManger:^(AddManger *mgr) {
? ? ? ? ? ? mgr.add(3).add(4).add(5);
}];
下面就看如何實現(xiàn)
1族吻、先定義一個NSObject的分類如下:
#import "AddManger.h"
@interface NSObject (RZ)
+ (int)makeAddManger:(void(^)(AddManger *))block;
@end
================================================================
#import "NSObject+RZ.h"
@implementation NSObject (RZ)
+ (int)makeAddManger:(void (^)(AddManger *))block
{
? ? ? ? ?AddManger *mgr = [[AddManger alloc] init];
? ? ? ? ?block(mgr);
? ? ? ? ?return mgr.result;
}
@end
2、繼續(xù)定義一個類實現(xiàn)計算過程珠增,比如add:
#import@interface AddManger : NSObject
@property (nonatomic, assign)int result;
- (AddManger *(^)(int))add;
@end
================================================================
#import "AddManger.h"
@implementation AddManger
- (AddManger *(^)(int))add
{
? ? ? ? ?AddManger *(^aBlock)(int) = ^(int value){
? ? ? ? ? ? ? ? ? ? _result += value;
? ? ? ? return self;
};
return aBlock;
}
當然也可以寫成這樣
- (AddManger *(^)(int))add
{
? ? ? ? return ^(int value) {
? ? ? ? ? ? ?_result += value;
? ? ? ? return self;
? ? ? ? };
}
@end
3.然后調(diào)用
int result = [NSObject makeAddManger:^(AddManger *mgr) {
? ? ? ? ? ? mgr.add(3).add(4).add(5);
}];
NSLog(@"result====%d", result);
4.實現(xiàn)過程
1.步驟3超歌,調(diào)用nsobject的分類方法makeAddManger:^(AddManger *mgr)block,該方法的參數(shù)是一個block切平,在這里傳遞一個定義好的block到該函數(shù)握础。block的實現(xiàn)是mgr.add(3).add(4).add(5)
2.步驟1,是分類方法makeAddManger:^(AddManger *mgr)block的具體實現(xiàn)悴品,該方法內(nèi)部初始化一個AddManger實例對象mgr禀综,然后作為block的參數(shù)傳入block简烘,也就是步驟3的block內(nèi)部的mgr參數(shù),然后調(diào)用該block定枷,也就是上一步實現(xiàn)的這句代碼mgr.add(3).add(4).add(5)孤澎,然后返回執(zhí)行完畢后的結(jié)果,也就是mgr.result欠窒。
3是鏈式調(diào)用代碼mgr.add(3).add(4).add(5)的關(guān)鍵覆旭,可以看到add方法返回的是一個block,該block的實現(xiàn)是累加傳遞進來的值然后賦值給屬性result保存下來岖妄,然后返回值是self型将,也就是AddManger實例對象。這樣可以實現(xiàn)點語法繼續(xù)調(diào)用add方法荐虐。