鏈式編程和函數式編程


說起鏈式編程和函數式編程,小伙伴們千萬不要緊張。

聽着很高大尚,其實也就那么回事。相信有過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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM