說起鏈式編程和函數式編程,小伙伴們千萬不要緊張。 聽著很高大尚,其實也就那麼回事。相信有過C#開發經驗的,或者其他編程經驗的,只要不是OC,一看就知道。 看兩行代碼: 上面的就是鏈式編程+函數式編程。 來個大白話解釋:看到括弧裡面的參數了吧,跟C的函數調用是不是很相似,包括別的語言,都用小括弧傳參, ...
說起鏈式編程和函數式編程,小伙伴們千萬不要緊張。
聽著很高大尚,其實也就那麼回事。相信有過C#開發經驗的,或者其他編程經驗的,只要不是OC,一看就知道。
看兩行代碼:
1 Person *person = [[Person alloc] init]; 2 person.run(9.2).eat(@"香蕉").run(1.2).eat(@"麵條");
上面的就是鏈式編程+函數式編程。
來個大白話解釋:看到括弧裡面的參數了吧,跟C的函數調用是不是很相似,包括別的語言,都用小括弧傳參,只有OC是冒號傳參。
再看方法調用用的是".",而OC用的是[]+空格。
這幾個方法調用,如果要按OC的打法,估計要整4行,對象一個一個的調用方法,但鏈式就是這麼一行搞定。
我們來分析一下,在OC中,什麼可以通過小括弧()來傳參呢,沒錯,那就是Block,調用Block的時候,blockName(para),就是這樣。
所以,我們推斷run(para)和eat(para)這兩個方法,肯定返回值是一個Block,而且是帶一個參數的Block。
那麼通過 《點》 調用方法怎麼解釋呢? 點其實就是調用getter方法,所以run和eat方法沒有參數,只有一個返回類型為Block的值。
而且,能一直點下去,說明什麼呢,說明Block也有返回值啊,而且返回值的類型就是當前對象的類型。
哈哈,這下明白了吧。
原理說明白了,我們上代碼吧:
Person類頭文件:
1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 5 // 函數的返回值是一個Block,Block的返回值是當前對象,Block有一個參數 6 - (Person *(^)(double distance))run; 7 8 // 函數的返回值是一個Block,Block的返回值是當前對象,Block有一個參數 9 - (Person *(^)(NSString *food))eat; 10 11 @end
Person類的.m文件:
1 #import "Person.h" 2 3 @implementation Person 4 5 - (Person *(^)(double))run{ 6 // 方法的返回是一個”有參無返回值的Block“ 7 return ^(double distance){ 8 NSLog(@"跑:%f",distance); 9 // block的返回值是當前對象 10 return self; 11 }; 12 } 13 14 - (Person *(^)(NSString *))eat{ 15 // 方法的返回是一個”有參無返回值的Block“ 16 return ^(NSString *food){ 17 NSLog(@"吃:%@",food); 18 // block的返回值是當前對象 19 return self; 20 }; 21 } 22 23 @end
看到了吧,一定要看這2行註釋,這可是整個的核心。
接下來,調用即可。
1 #import "ViewController.h" 2 #import "Person.h" 3 4 @interface ViewController () 5 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 [super viewDidLoad]; 12 13 Person *person = [[Person alloc] init]; 14 15 // 這就是鏈式編程+函數式編程 16 person.run(9.2).eat(@"香蕉").run(1.2).eat(@"麵條"); 17 } 18 19 @end