链式编程和函数式编程

提及链式编程和函数式编程,小伙伴们千万没关系张。编程

听着很高大尚,其实也就那么回事。相信有过C#开发经验的,或者其余编程经验的,只要不是OC,一看就知道。函数式编程

看两行代码:函数

1     Person *person = [[Person alloc] init];
2     person.run(9.2).eat(@"香蕉").run(1.2).eat(@"面条");

上面的就是链式编程+函数式编程。spa

来个大白话解释:看到括号里面的参数了吧,跟C的函数调用是否是很类似,包括别的语言,都用小括号传参,只有OC是冒号传参。code

再看方法调用用的是".",而OC用的是[]+空格。对象

这几个方法调用,若是要按OC的打法,估计要整4行,对象一个一个的调用方法,但链式就是这么一行搞定。blog

 

咱们来分析一下,在OC中,什么能够经过小括号()来传参呢,没错,那就是Block,调用Block的时候,blockName(para),就是这样。开发

因此,咱们推断run(para)和eat(para)这两个方法,确定返回值是一个Block,并且是带一个参数的Block。get

那么经过 《点》 调用方法怎么解释呢? 点其实就是调用getter方法,因此run和eat方法没有参数,只有一个返回类型为Block的值。it

并且,能一直点下去,说明什么呢,说明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
相关文章
相关标签/搜索