AJ分享,必须精品
一:场景
我们有个对象人,他有两个方法,一个是学习study,一个是跑步run,
这个人有个怪癖,跑完步之后必须学习,为了实现这个方法并且能调用方便,我们让跑步和学习都回返回自己这个对象作为下一次调用的快捷方式,代码如下:
调用:
int main(int argc, const char * argv[])
{
@autoreleasepool {
//初始化人
Person *p = [[Person alloc] init];
//调用
[[p study] run];
return 0;
}
人对象:
// Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (Person *)study;
- (Person *)run;
@end
// Person.m
#import "Person.h"
@implementation Person
- (Person *)study
{
NSLog(@"study----");
return self;
}
- (Person *)run
{
NSLog(@"run----");
return self;
}
@end
运行结果
二:block链式结构实现
调用:
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[Person alloc] init];
p.study(@"xx宝典").run().study(@"xx剪发");
}
return 0;
}
人对象:
//Person.h
@interface Person : NSObject
- (Person *(^)(NSString *name))study;
- (Person *(^)())run;
@end
//Person.m
@implementation Person
- (Person *(^)(NSString *))study
{
return ^(NSString *name){
NSLog(@"study----%@", name);
return self;
};
}
- (Person *(^)())run
{
return ^{
NSLog(@"run----");
return self;
};
}
@end
在这里面,我们
p.study(@”xx宝典”).run().study(@”xx剪发”);
调用study方法:p.study
执行block:p.study(@”xx宝典”)
结合person内部写的方法
- (Person *(^)(NSString *))study
{
return ^(NSString *name){
NSLog(@"study----%@", name);
return self;
};
}
明显可以看到,当执行p.study(@”xx宝典”)时候,内部是return一个返回值是person*类型(最后的return self)的block 这也就解释了为什么下一句可以继续连着用点来调用了。也就是说返回的是一段block,这段block里面又有返回值,返回值是person的对象self。
这里的参数有点晕,记住就好,用链式结构的block的巧妙用法,简单了解就好
执行结果