鏈式編程思想

什么是鏈式編程?
顧名思義,鏈式編程是通過一行代碼,實現(xiàn)某種功能。這里比較經(jīng)典的案例就是masonry框架,相信對于我們來說都不陌生。類似于這種效果:

 make.top.equalTo(self.view).offset(60)

是可以通過(.)實現(xiàn)某種效果的。
而通過”點”語法,將需要執(zhí)行的代碼塊連續(xù)的書寫下去,就是鏈式編程.它能使代碼可讀性強,書寫方便,簡單解藕。

鏈式編程嘗試

下面我們來嘗試一下用鏈式編程,實現(xiàn)一個計算器的功能
創(chuàng)建一個MannerResultModel管理類和NSObject+sum.h分類,其中,MannerResultModel是對result結(jié)果的管理

MannerResultModel.h 
#import <Foundation/Foundation.h>
@interface MannerResultModel : NSObject
//計算結(jié)果
@property(assign,nonatomic)int result;

// 調(diào)用帶參數(shù)的方法
//-(instancetype)add:(int)value;

// 調(diào)用無參數(shù)的block
//-(void(^)(int value))add;

//調(diào)用有參數(shù),并且有返回值block
-(MannerResultModel *(^)(int value))add;
-(MannerResultModel *(^)(int value))reduce;
-(MannerResultModel *(^)(int value))multiply;
-(MannerResultModel *(^)(int value))divide;

@end

MannerResultModel.m
#import "MannerResultModel.h"

@implementation MannerResultModel
// 加
-(MannerResultModel * (^)(int value))add{
    __weak typeof(self)weakSelf = self;
    return ^(int value){
        weakSelf.result += value;
        return self;
    };
}
// 減
-(MannerResultModel * (^)(int value))reduce{
    __weak typeof(self)weakSelf = self;
    return ^(int value){
        weakSelf.result -= value;
        return self;
    };
}
// 乘
-(MannerResultModel * (^)(int value))multiply{
    __weak typeof(self)weakSelf = self;
    return ^(int value){
        weakSelf.result *= value;
        return self;
    };
}
// 除
-(MannerResultModel * (^)(int value))divide{
    __weak typeof(self)weakSelf = self;
    return ^(int value){
        weakSelf.result /= value;
        return self;
    };
}

NSObject+sum.h類
#import <Foundation/Foundation.h>
#import "MannerResultModel.h"
@interface NSObject (sum)
+ (int)lc_makeContraints:(void(^)(MannerResultModel *))sumBlock;
@end

NSObject+sum.m類
#import "NSObject+sum.h"
@implementation NSObject (sum)
+ (int)lc_makeContraints:(void (^)(MannerResultModel *))sumBlock{
    MannerResultModel * mgr = [[MannerResultModel alloc]init];
    sumBlock(mgr);
    return mgr.result;
}
@end

嘗試一:用帶參數(shù)的返回本身的方法回調(diào)
結(jié)果:實現(xiàn)的是[]調(diào)用效果,不能夠?qū)崿F(xiàn)鏈式效果

int result = [NSString lc_makeContraints:^(MannerResultModel *mar) {
        MannerResultModel *manner = [mar add:111];
     }];
NSLog(@"result====%d",result);

嘗試二:用不帶參數(shù)的block的方法回調(diào)
結(jié)果:實現(xiàn)的第一個可以使用(.)語法,因為沒有返回值,所以不能再調(diào)用其它方法
*/不能夠?qū)崿F(xiàn)鏈式效果
int result = [NSString lc_makeContraints:^(MannerResultModel *mar) {
mar.add(100);
}];
NSLog(@"result====%d",result);

嘗試三:有參數(shù)的block ,返回對象本身
嘗試結(jié)果:用‘( )’實現(xiàn)函數(shù)式編程 + ‘ . ’形成鏈式編程(帶參),用block實現(xiàn)

int result = [NSString lc_makeContraints:^(MannerResultModel *msg) {
    msg.add(100).reduce(99).multiply(2).divide(2);
}];
NSLog(@"result====%d",result);

嘗試結(jié)果:實現(xiàn)了類似于masonry的鏈式效果,good!
最后總結(jié):

msg.add(100).reduce(99).multiply(2).divide(2);

所謂的這種鏈式編程,實際上是把block作為一個返回值,并且是返回一個對象,再次進行點語法時,依然調(diào)用方法,然后返回一個對象,所以可以一直進行方法操作,實現(xiàn)某種功能。

原理

原理就是調(diào)用的屬性的類型或者方法的返回類型為原調(diào)用屬性的類型
例如說UILabel調(diào)用了某個方法或者屬性,得到的類型還是UILabel,那么還可以繼續(xù)調(diào)用UILabel的屬性或者方法

明白了嗎?明白了嗎?
END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容