在介绍函数式编程之前,大家先了解下在平常工作中,我们那些地方使用了函数式编程,以及使用函数编程有哪些好处.
对JavaScript进行封装了的jQuery就是函数式编程的经典之作
$("p").css("background-color");
iOS 中Masonry第三方约束也是使用了函数式编程的思想
make.centerY.equalTo(self.view).offset(100);
我们先分析一下,这样写,有什么好处
- 把某一个设置进行模块化,每一个 "." 之后都代表着一个功能的添加(看上去,条理清晰)
- 在添加和取出某一功能模块更加容易,只需要删除 "." 之后的那一功能即可
是不是感觉好厉害!!!
那么iOS 要想实现这样的编程方式,我们需要了解什么呢?
- 其实每一个功能模块,都有一个返回值,而且实现函数式编程的重点就是这个返回值,自始至终,连接这些功能块就是这个返回值
是不是有点明白?
举个例子:
@interface Person : NSObject
- (void)eat;
- (void)run;
@end
@implementation Person
- (void)eat{
NSLog(@"吃饭");
}
- (void)run{
NSLog(@"跑步");
}
@end
Person *person = [[Person alloc] init];
[person eat];
[person run];
是不是很熟悉,要是不熟悉的话,请洗洗睡吧
eat 和 run 算不算是两个功能点?,是不是都是这个人在做?
上面说了, 函数式编程的主线就是那个返回值
改:
@interface Person : NSObject
- (Person *)eat;
- (Person *)run;
@end
@implementation Person
- (Person *)eat{
NSLog(@"吃饭");
return self;
}
- (Person *)run{
NSLog(@"跑步");
return self;
}
@end
Person *person = [[Person alloc] init];
[[person eat] run];
哎呀! 是不是有点感觉了
继续改:
@interface Person : NSObject
- (Person *(^)())eat;
- (Person *(^)())run;
@end
@implementation Person
- (Person *(^)())eat{
return ^Person *(){
NSLog(@"吃饭");
return self;
};
}
- (Person *(^)())run{
Person *(^block)() = ^(){
NSLog(@"跑步");
return self;
};
return block;
}
@end
Person *person = [[Person alloc] init];
person.run().eat();
哦,是不是很简单,这个时候每次返回的是一个block块