驕傲使人落後,房價使人虛心進步。
本文主要在上文的基礎上進行拓展,在鏈式屬性的基礎上實現鏈式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是可以實現自動補全的。