我們常見的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傳參是很好的選擇
*/