链式编程和函数式编程_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 链式编程和函数式编程

链式编程和函数式编程

 2016/11/5 5:32:14  熊猫超人1024  程序员俱乐部  我要评论(0)
  • 摘要:说起链式编程和函数式编程,小伙伴们千万不要紧张。听着很高大尚,其实也就那么回事。相信有过C#开发经验的,或者其他编程经验的,只要不是OC,一看就知道。看两行代码:1Person*person=[[Personalloc]init];2person.run(9.2).eat(@"香蕉").run(1.2).eat(@"面条");上面的就是链式编程+函数式编程。来个大白话解释:看到括号里面的参数了吧,跟C的函数调用是不是很相似,包括别的语言,都用小括号传参,只有OC是冒号传参。再看方法调用用的是"
  • 标签:函数 编程

说起链式编程和函数式编程,小伙伴们千万不要紧张。

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

 

发表评论
用户名: 匿名