链式编程
- 链式编程,其实就是通过
.
点语法将多行代码链接成一句代码,书写简洁、可读性好,但代码语法苦涩难懂。关于链式编程的使用那就是仁者见仁智者见智了。这篇文章主要介绍一下链式编程的简单实现。先来看一下下面的代码:
LTView *view = [[LTView alloc] initWithFrame:CGRectMake(100, 100, 0, 0) Config:^(LTView *view) {
view.lt_bgColor([UIColor redColor]).lt_viewWidth(100).lt_viewHeigth(100);
}];
如何实现
- 如何实现这样的效果的呢?我们知道实现链式编程,需要能够一直点下去,其实就是不断地返回实例对象,什么有返回值呢?方法有返回值,但是绝大多数的方法不能用
.
调用,不过OC中有一种block类型的语法。那么到这里我们就有了一个基本的思路:使用Block语法实现,而且Block的返回值是该类的一个实例,然后在这个Block里我们去做一些相应的操作。
1、属性方式
自定义LTView
类继承UIView
,在view中声明lt_bgColor
属性,用来改变view的背景颜色,并重写属性的get
方法
//属性声明
@property (nonatomic, copy) LTView *(^lt_bgColor)(UIColor *);
//属性get方法
- (LTView *(^)(UIColor *))lt_bgColor {
return ^(UIColor *color) {
self.backgroundColor = color;
return self;
};
}
说明:给view声明一个block类型的属性,block参数为UIColor *
,返回值为类的实例对象,属性的get方法中返回就是这种类型的block。
2、函数声明方式
同样在LTView
类中如下两个函数lt_viewWidth
,lt_viewHeigth
分别用来改变view的宽度和高度。函数实现如下:
//函数声明
-(LTView *(^)(CGFloat width))lt_viewWidth;
-(LTView *(^)(CGFloat height))lt_viewHeigth;
//函数实现
- (LTView *(^)(CGFloat))lt_viewWidth {
return ^(CGFloat width) {
CGRect frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, width, self.frame.size.height);
self.frame = frame;
return self;
};
}
-(LTView *(^)(CGFloat))lt_viewHeigth {
return ^(CGFloat height) {
CGRect frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, height);
self.frame = frame;
return self;
};
}
最终实现效果
通过上面两种方式,接下来我们就可以愉快的用点语法写代码了
view.lt_bgColor([UIColor blueColor]).lt_viewWidth(200).lt_viewHeigth(200);