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传参是很好的选择

 */



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值