//
函数式编程
:
对象调用方法
,
返回这个对象本身
,
然后再去调用另一个方法
,
调用完返回的还是这个对象本身
.
//
链式编程
:
通过
”
点
”
语法去调用方法,使用
’()‘
即
block
的方式调用方法,如果要实现函数式编程,需要返回
'block'
// masonry
是函数式编程和链式编程的
经典代表
UIView
*view = [[
UIView
alloc
]
init
];
view.
backgroundColor
= [
UIColor
blueColor
];
[
self
.
view
addSubview
:view];
[view
mas_makeConstraints
:^(
MASConstraintMaker
*make) {
make.
top
.
equalTo
(
self
.
view
).
offset
(
40
);
make.
size
.
mas_offset
(CGSizeMake(
100
,
100
));
make.
centerX
.
equalTo
(
self
.
view
).
offset
(-
40
);
}];
XZPeson.h中
@interface
XZPersonA :
NSObject
//
在
person
类中定义两个方法
- (
void
)run;
- (
void
)eat;
//
在
person
类中定义两个方法,返回对象本身
- (
XZPersonA
*)run1;
- (
XZPersonA
*)eat1;
//
在
Person
类中定义两个方法,返回值是不带参数的
block
,
block
的返回值是对象本身
- (
XZPersonA
*(^)())run2;
- (
XZPersonA
*(^)())eat2;
//
在
Person
类中定义两个方法,返回值是带参数的
block
,
block
的返回值是对象本身
- (
XZPersonA
*(^)(
double
distance))run3;
- (
XZPersonA
*(^)(
NSString
*food))eat3;
@end
XZPeson.m中
#import
"XZPersonA.h"
@implementation
XZPersonA
//
在
person
类中定义两个方法
- (
void
)run {
NSLog
(
@"%s"
,
__FUNCTION__
);
}
- (
void
)eat {
NSLog
(
@"%s"
,
__FUNCTION__
);
}
//
在
person
类中定义两个方法,返回对象本身
- (
XZPersonA
*)run1 {
NSLog
(
@"%s"
,
__FUNCTION__
);
return
self
;
}
- (
XZPersonA
*)eat1 {
NSLog
(
@"%s"
,
__FUNCTION__
);
return
self
;
}
//
在
Person
类中定义两个方法,返回值是不带参数的
block
,
block
的返回值是对象本身
- (
XZPersonA
* (^)())run2 {
//
因为返回值是一个
block
,所以我们需要定义一个
block
,因为要返回值是对象本身,所以在这个
block
的内部实现中返回这个对象本身;
XZPersonA
* (^runBlock)() = ^{
return
self
;
};
NSLog
(
@"%s"
,
__FUNCTION__
);
return
runBlock;
}
- (
XZPersonA
* (^)())eat2 {
XZPersonA
*(^eatBlock)() = ^() {
return
self
;
};
NSLog
(
@"%s"
,
__FUNCTION__
);
return
eatBlock;
}
//
在
Person
类中定义两个方法,返回值是带参数的
block
,
block
的返回值是对象本身
- (
XZPersonA
*(^)(
NSString
*food))eat3 {
// XZPersonA *(^eatBlock)(NSString *food) = ^(NSString *foods) {
// return self;
// };
// return eatBlock;
//
即
return
^(
NSString
*food) {
NSLog
(
@"
吃
%@"
,food);
return
self
;
};
}
- (
XZPersonA
*(^)(
double
distance))run3 {
//
方法的返回值是一个
block
,这个
block
的返回值是类本身
return
^(
double
distance) {
NSLog
(
@"
跑
%.2f
千米
"
,distance);
return
self
;
};
}
@end
XZFunAndChainProController.m中
//
函数式编程和链式编程
#import
"XZFunAndChainProController.h"
#import
"XZPersonA.h"
@interface
XZFunAndChainProController ()
@end
@implementation
XZFunAndChainProController
- (
void
)viewDidLoad {
[
super
viewDidLoad];
//
在
Person
类中定义两个方法,传统方法调用
,
两个方法需要单独调用
,
也不能任意组合顺序
XZPersonA *person = [[XZPersonA alloc] init];
[person run];
[person eat];
//
链式编程目标是
[[person run1] eat2]
,如果想要实现这个目标,
[person run1]
调用完毕就要返回
person
这个对象本身
//
所以,在
Person
类中定义两个方法,返回对象本身
[[person run1] eat1];
[[person eat1] run1];
//
函数式编程的目标是
person.run2().eat2()
,
OC
中使用
‘()’
的地方是什么呢?执行
block
的时候需要
()
,所以,如果要实现函数式编程,需要返回
'block'
//
在
Person
类中定义两个方法,返回值是不带参数的
block,block
的返回值是对象本身
person.run2().eat2();
person.eat2().run2();
//
在
Person
类中定义两个方法,返回值是带参数的
block,block
的返回值是对象本身
person.run3(
3.5
).eat3(
@"
食物
"
);
person.eat3(
@"
食物
"
).run3(
3.5
);
}
@end
该方法的返回值是带参数的block,block的返回值是对象本身