0
点赞
收藏
分享

微信扫一扫

Objective-C 实现链式调用

村里搬砖的月野兔 2021-09-29 阅读 73
日记本

链式调用也是所谓的链式编程,在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];
举报

相关推荐

0 条评论