骄傲使人落后,房价使人虚心进步。
本文主要在上文的基础上进行拓展,在链式属性的基础上实现链式Block
使用效果是这样滴,有没有一点小心动。
_person.leftHook(^(NSString *attackName){
NSLog(@"先来%@",attackName);
}).rightHook(^(NSString *attackName){
NSLog(@"再来%@",attackName);
});
区别在于Block的参数也是一个Block(就这么一点点区别 (T^T) ),直接贴代码.
Person.h
@class Person;
// 攻击回调Block
typedef void(^AttackCallBackBlock)(NSString *attackName);
// 攻击
typedef Person *(^AttackBlock)(AttackCallBackBlock callBackBlock);
@interface Person : NSObject
@property (nonatomic ,strong) AttackBlock leftHook;
@property (nonatomic ,strong) AttackBlock rightHook;
- (void)initial;
- (void)launchLeftHookAction;
- (void)launchRightHookAction;
@end
Person.m
@interface Person ()
@property (nonatomic ,copy) AttackCallBackBlock leftHookCallBack;
@property (nonatomic ,copy) AttackCallBackBlock rightHookCallBack;
@end
@implementation Person
#pragma mark - PublicMethod
- (void)initial{
__weak Person *weakSelf = self;
self.leftHook = ^(AttackCallBackBlock callBackBlock){
weakSelf.leftHookCallBack = callBackBlock;
return weakSelf;
};
self.rightHook = ^(AttackCallBackBlock callBackBlock){
weakSelf.rightHookCallBack = callBackBlock;
return weakSelf;
};
}
- (void)launchLeftHookAction{
_leftHookCallBack(@"发动一记左勾拳");
}
- (void)launchRightHookAction{
_rightHookCallBack(@"发动一记右勾拳");
}
@end
调用,这里是拖了2个Button去调用Person里面的两个开放的方法,分别发动左勾拳和右勾拳。
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_person = [[Person alloc] init];
[_person initial];
_person.leftHook(^(NSString *attackName){
NSLog(@"先来%@",attackName);
}).rightHook(^(NSString *attackName){
NSLog(@"再来%@",attackName);
});
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - IBAction
- (IBAction)action1:(id)sender {
[_person launchLeftHookAction];
}
- (IBAction)action2:(id)sender {
[_person launchRightHookAction];
}
@end
效果如下:
最后说下对这种写法的缺点,代码补全有点不友好,部分要自己手写,不知道有没有办法可以完善一下,目前已知swift是可以实现自动补全的。