提及链式编程和函数式编程,小伙伴们千万没关系张。编程
听着很高大尚,其实也就那么回事。相信有过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