Block (三) OC中的函數式編程\鏈式編程


我們常見的OC 函數調用方式都是中括號的 消息傳遞機制,

由於鏈式編程的函數調用更偏於.語法的函數調用方式,而在OC中,能夠勝任如此功能的首先就讓人想起了block塊的C式特點。

關於鏈式編程,有一個佈局約束的第三方庫中大量使用到:  Masonry ! here you are


總結一下關於鏈式編程和函數式編程 使用

1.也許在自己封裝框架時候可以用到

2.也許在閱讀其他人的框架時候可以用到(如:Masonry


下方的代碼片段,簡單介紹瞭如果構成一個支持鏈式編程的函數調用體系,以及如何使用Block語法來實現鏈式編程的效果。

Talk is cheap, so:



#import <Foundation/Foundation.h>

#import "MyObjc.h"



@interface OBJCOne : NSObject

- (OBJCOne *)callGod;

- (OBJCOne *)callSelf;


- ( void(^)() )callHeart;

- ( OBJCOne *(^)() )callMind;

- ( OBJCOne *(^)(NSString *task) )callLove;

- ( OBJCOne *(^)(NSString *task) )callHealth;



@end


@implementation OBJCOne

- (OBJCOne *)callGod {

    printf("%s \n",__FUNCTION__);

    return self;

}


- (OBJCOne *)callSelf {

    printf("%s \n",__FUNCTION__);

    return self;

}


- ( void(^)() )callHeart; {

    return ^{

        printf("Heart \n");

    };

}

- ( OBJCOne *(^)() )callMind; {

    return ^{

        printf("Mind \n");

        return self;

    };

}

- ( OBJCOne *(^)(NSString *task) )callLove;{

    return ^(NSString *task){

        printf("task = %s \n",task.UTF8String);

        return self;

    };

}

- ( OBJCOne *(^)(NSString *task) )callHealth;{

    return ^(NSString *task){

        printf("tast = %s \n",task.UTF8String);

        return self;

    };

}




@end




int main(int argc, const char * argv[]) {

    @autoreleasepool {

        NSLog(@"Hello, World!");


        OBJCOne *_objcOne = [OBJCOne new];


        _objcOne = _objcOne.callGod.callSelf;

//        -[OBJCOne callGod]

//        -[OBJCOne callGod]


        [[[[_objcOne callGod] callSelf] callGod] callSelf];

//        -[OBJCOne callGod]

//        -[OBJCOne callSelf]

//        -[OBJCOne callGod]

//        -[OBJCOne callSelf]



        _objcOne.callHeart();

//        Heart


        _objcOne.callMind().callHeart();

//        Mind

//        Heart


        _objcOne.callLove(@"love1").callLove(@"love2").callHealth(@"runfast").callLove(@"love more");

//        task = love1

//        task = love2

//        tast = runfast 

//        task = love more 


    }

    return 0;

}


/*

總而言之,看看代碼,估摸着也就明白了很多,自己動手,能夠體會到更多。

    實現函數式編程/鏈式編程的設計思路:

    1. 首先看看傳統的OC方法,

        [objc method1]//且定義爲 M1

        [objc method2]//且定義爲 M2

    2. 設計思路

        如果要實現[[objc method1] method2] ==》【M1  method2 ==M2

        按照OC語法,調用method1method2receiver需要是一個objc實例。也就是說M1M2如果是objc實例的話就可以實現鏈式調用方法了。

        OC方法可以提供一個返回值,如果需要返回一個objc實例,並且不對對象做修改,那麼直接利用self返回對象本身就好了。

        因此定義函數的時候帶上返回值,返回值類型是對象實體類型,返回的是改實體本身。

        - (OBJC *)callMethod { code_you_want_do ;  return self}

 

    3. 實現objc.method1().method2(id1).method2(id2).method1()  其實也是一樣到道理

        1.需要返回實體對象

        2.利用block函數的特點進行傳參

        3.如果函數攜帶OC 形式的傳參,C函數式的編程效果就達不到了,所以使用C block傳參是很好的選擇

 */



發佈了25 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章