我们常见的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语法,调用method1或method2的receiver需要是一个objc实例。也就是说M1和M2如果是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传参是很好的选择
*/