Objective-C 實現鏈式調用

鏈式調用也是所謂的鏈式編程,是在Masonry中寫法看起來十分直觀,調用起來也很簡單。在特定的應用環境下利用block實現鏈式編程,確實會大大的使代碼直觀易讀。

[_contentView addSubview:_imgView];   
[_imgView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.leading.equalTo(@(20));
        make.top.equalTo(@(20));
        make.bottom.equalTo(@(-20));
        make.height.equalTo(@(CellHeight - 40));
        make.width.equalTo(self.imgView.frame.height);
}];

1. 方法的通常調用過程

// Animal.h 中定義
- (void)eat;
- (void)sleep;

// Animal.m 中實現
- (void)eat {
    NSLog(@"%s", __FUNCTION__);
}
- (void)sleep {
    NSLog(@"%s", __FUNCTION__);
}

// 通常調用過程
Animal *animal = [[Person alloc] init];
[animal sleep];
[animal eat];

2. 普通的鏈式調用

普通的鏈式調用就是我們常見的,多個[ ]方法調用嵌套在一起,達到鏈式調用的效果,還是比較好理解,也比較常用。

// Animal.h 中定義
- (Animal *)eat;
- (Animal *)sleep;

// Animal.m 中實現
- (Animal *)eat {
    NSLog(@"%s", __FUNCTION__);
    return self;
}
- (Animal *)sleep {
    NSLog(@"%s", __FUNCTION__);
    return self;
}

// 鏈式調用
[[animal eat] sleep];
//[[animal sleep] eat];

3. 用block實現鏈式調用

如下定義相當於直接使用block變量的get方法:

// Animal.h 中定義
- (void (^)())eat;
- (void (^)())sleep;

// Animal.m 中實現
- (void (^)())eat {
    void (^eatBlock)() = ^ {
        NSLog(@"%s", __FUNCTION__);
    };
    return eatBlock;
}
- (void (^)())sleep {
    return ^ {
        NSLog(@"%s", __FUNCTION__);
    };
}

// 調用
animal.eat();
animal.sleep();

則,block的鏈式調用

// Animal.h  中定義
- (Animal * (^)(NSString *foodName))eat;
- (Animal * (^)(NSInteger hour))sleep;

// Animal.m 中實現
- (Animal *(^)(NSString *))eat {
    Animal * (^eatBlock)() = ^(NSString *foodName) {
        NSLog(@"喫: %@", foodName);
        return self;
    };
    return eatBlock;
}
- (Animal *(^)(NSInteger))sleep {
    return ^(NSInteger hour) {
        NSLog(@"睡%ld", (long)hour);
        return self;
    };
}

// 鏈式調用
animal.eat(@"蛋糕").sleep(8);
animal.sleep(8).eat(@"麪包");

4. 請實現一個例子

我們創建一個view,平常初始化時會直接調用其.frame、.backgroundColor等方法設置樣式。大家可以試着使用鏈式編程方式實現以下功能:

CustomView *custom = [CustomView makeCustomView:^(CustomView *custom) {
        custom.viewFrame(CGRectMake(50, 50, 200, 200)).viewColor([UIColor cyanColor]);
}];
[self.view addSubview:custom];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章