iOS_鏈式編程2

驕傲使人落後,房價使人虛心進步。


本文主要在上文的基礎上進行拓展,在鏈式屬性的基礎上實現鏈式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是可以實現自動補全的。

全部代碼在這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章