TAG

RSS订阅

收藏本站

设为首页

当前位置:主页 > 移动开发 > IOS开发 >

链式编程和函数式编程,链式编程函数

发布时间:2016-12-21 22:13 类别:IOS开发

链式编程和函数式编程,链式编程函数


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

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

 

猜你会喜欢....

Copyright © 2015 www.wahenzan.com 哇!很赞 版权所有 浙ICP备14030256号-1 Power by DedeCms

浙公网安备 33010602005986号

声明:本站所有文章除标明原创外,均来自网络转载,版权归原作者所有,如果有侵犯到您的权益,请联系本站删除 网站管理员:758763728

360网站安全检测平台