链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好
链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)
代表:Masonry框架。
make.top.equalTo(self.view).offset(60)
像这样top.equalTo(self.view).offset(60)
通过”点”语法,将需要执行的代码块连续的书写下去,就是链式编程.它能使代码简单易读,书写方便
像这样equalTo(self.view)
通过’()’去调用函数,一般调用完返回的还是这个对象本身,就是函数式编程.
函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。
函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)
代表:ReactiveCocoa。
函数式编程
1. 如果想再去调用别的方法,那么就需要返回一个对象;
2. 如果想用()去执行,那么需要返回一个block;
3. 如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。
用’[]’实现连续调用
Person.h:
- (Person *)eat2;
- (Person *)sleep2;
Person.m:
- (Person *)eat2
{
NSLog(@"%s",__FUNCTION__);
return self;
}
- (Person *)sleep2
{
NSLog(@"%s",__FUNCTION__);
return self;
}
ViewController.m:
[[person eat2] sleep2];
[[person sleep2] eat2];
用’()”实现函数式编程,用block实现
Person.h:
- (void (^)())eat3;
- (void (^)())sleep3;
Person.m:
- (void (^)())eat3
{
//定义block
void (^eat3Block)() = ^ {
NSLog(@"%s",__FUNCTION__);
};
return eatBlock;
}
- (void (^)())sleep3
{
return ^ {
NSLog(@"%s",__FUNCTION__);
};;
}
ViewController.m:
person.eat3();
person.sleep3();
实现函数式 + 链式(无参)
Person.h:
- (Person * (^)())eat4;
- (Person * (^)())sleep4;
Person.m:
- (Person *(^)())eat4
{
Person * (^eat4Block)() = ^ {
NSLog(@"%s",__FUNCTION__);
return self;
};
return eat4Block;
}
//上下两种写法一样
- (Person *(^)())sleep4
{
return ^ {
NSLog(@"%s",__FUNCTION__);
return self;
};
}
ViewController.m:
person.eat4().sleep4();
person.sleep4().eat4();
实现函数式 + 链式(带参)
Person.h:
- (Person * (^)(NSString *foodName))eat5;
- (Person * (^)(NSInteger hour))sleep5;
Person.m:
- (Person *(^)(NSString *))eat5
{
Person * (^eat5Block)() = ^(NSString *foodName) {
NSLog(@"吃: %@",foodName);
return self;
};
return eat5Block;
}
//上下两种写法一样
- (Person *(^)(NSInteger))sleep5
{
return ^(NSInteger hour) {
NSLog(@"睡了%ld小时",(long)hour);
return self;
};
}
ViewController.m:
person.eat5(@"蛋糕").sleep5(8);
person.sleep5(8).eat5(@"面包");
网友评论