iOS開發(fā)探索-鏈式編程實踐與分析

我們經(jīng)常使用的開源框架 Masonry 就是使用這樣的編程思想,Masonry是一個OC開發(fā)中,非常好用的自動布局框架,通過點語法來進行多個操作

代碼示例:

[greenView makeConstraints:^(MASConstraintMaker *make) {
    make.top.greaterThanOrEqualTo(superview.top).offset(padding);
    make.left.equalTo(superview.left).offset(padding);
    make.bottom.equalTo(blueView.top).offset(-padding);
    make.right.equalTo(redView.left).offset(-padding);
}];

這種將多個操作(多行代碼)通過點號(.)鏈接在一起成為一句代碼,使代碼可讀性提高,我們稱之為鏈式編程。

鏈式編程特點:方法的返回值是block,block必須返回對象本身(返回block時,block所在的方法調(diào)用者對象)block的參數(shù)是需要操作的值。

下面通過一個簡單的示例解讀鏈式編程,展示鏈式編程的魅力。

1. 創(chuàng)建Person類

person.h 頭文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (Person* (^)())eat;
- (Person* (^)())go;
- (Person* (^)(NSString *))study;
@end

person.m 實現(xiàn)文件
#import "Person.h"
@implementation Person

//該函數(shù)返回一個 Person* (^)() 類型的 block 變量,當該類對象調(diào)用 block() 會打印eat 并且返回該當前類對象
- (Person* (^)())eat
{
    //block變量保存的代碼段
    Person* (^block)() = ^(){
        NSLog(@"eat");
       //返回當前類對象
        return self;
    };
   //返回block變量
    return block;
}
- (Person* (^)())go
{
    return ^Person *(){
        NSLog(@"go go go");
        return self;
    };
}
//該函數(shù)返回一個 Person* (^)(NSString *) 類型的 block 變量
- (Person* (^)(NSString *))study
{
    Person* (^block)(NSString *) = ^(NSString *yyy){
        NSLog(@"%@ study",yyy);
        return self;
    };
    return block;
}
@end

2. 調(diào)用示例:

Person *person = [Person new];
person.eat().go().study(@"good good");

3. 輸出結(jié)果:

2016-02-26 14:37:06.179 Day2016-02-26-函數(shù)編程[2579:87725] eat 2016-02-26 14:37:06.180 Day2016-02-26-函數(shù)編程[2579:87725] go go go 2016-02-26 14:37:06.180 Day2016-02-26-函數(shù)編程[2579:87725] good good study

4. 分析:

分解以上調(diào)用的代碼
第一步:執(zhí)行 person.eat 返回對應(yīng)的eatBlock變量。
Person* (^eatBlock)() = person.eat;
第二步:執(zhí)行eatBlock,此時返回當前person對象。
person = eatBlock();
第三步:執(zhí)行 person.go 返回對應(yīng)的goBlock變量。

Person* (^goBlock)() = person.go;

第四步:執(zhí)行g(shù)oBlock,此時返回當前person對象。
person = goBlock();
第五步:執(zhí)行 person.study 返回對應(yīng)的studyBlock變量。
Person* (^studyBlock)(NSString *) = person.study;
第六步:執(zhí)行studyBlock,此時返回當前person對象。
person = studyBlock(@"good good");

按照分解步驟調(diào)用實現(xiàn):

Person *person = [Person new];
Person* (^eatBlock)() = person.eat;
person =  eatBlock();
Person* (^goBlock)() = person.go;
person =  goBlock();
Person* (^studyBlock)(NSString *) = person.study;
person =  studyBlock(@"good good");

輸出結(jié)果:
2016-02-26 15:40:34.371 Day2016-02-26-函數(shù)編程[2948:107876] eat 2016-02-26 15:40:34.371 Day2016-02-26-函數(shù)編程[2948:107876] go go go 2016-02-26 15:40:34.372 Day2016-02-26-函數(shù)編程[2948:107876] good good study

這樣就可以一直鏈接下去吧!實現(xiàn)了我們想要的目標!

5. 函數(shù)式編程總結(jié)

如果想再去調(diào)用別的方法,那么就需要返回一個對象;
如果想用()去執(zhí)行,那么需要返回一個block;
如果想讓返回的block再調(diào)用對象的方法,那么這個block就需要返回一個對象(即返回值為一個對象的block)

掃描下方二維碼關(guān)注我###

零距離仰望星空

在此感謝各位讀者的來訪,您的關(guān)注是我寫作分享的最大動力。

最后編輯于
?著作權(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)容