本来想将题目取名为 masonry源码心得之链式编程 的。但想着想着没什么必要,我写文章主要目的是做笔记自己看的。
链式编程是OC中一种很好的设计模式。框架中使用链式编程,会让框架使用者感觉写的代码更加美观简洁。
Masonry是使用了该模式的框架,所以部分代码展示使用了Masonry。
让自己的代码越来越好:
1、多看设计模式与算法的书籍,提高认知。
2、多看一些好的框架源码(它们很好的运用了一些设计模式和算法),对自己的实践能力有很大的帮助。
3、对自己要求更高一点,多一点美的追求。
链式编程de效果
- Masonry github
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
链式编程de关键语法
链式编程使用的两个关键且常用的语法:点语法、block。
- 点语法
可作用于属性,也可作用于无参的方法。 - block
使用block作为方法返回值,即调用该方法则可以返回一个block。
block可以定义任意类型的参数,也可定义返回值。
block的返回值类型是所在方法所属的类型(值不一定是self)。
关于block最好不要作为属性存在,随时爆发循环引用。或者你遇到block就使用weakSelf吧。
@interface MASConstraint
- (MASConstraint *)left;
- (MASConstraint * (^)(id attr))mas_equalTo;
@end
使用链式编程de SegmentBar
估计大家都封装过一个 SegmentBar:segmentBar简单示例code。
- 不使用链式编程de效果
这里如果想再次更改 config,则需要将config暴露出去。
// 主要代码
@interface LWSegmentBarConfig : NSObject
@property (nonatomic, strong) UIColor *itemNormalColor;
@property (nonatomic, strong) UIColor *itemSelectColor;
@end
// 使用演示
LWSegmentBarConfig *config = [LWSegmentBarConfig new];
config.itemNormalColor = [UIColor lightGrayColor];
config.itemSelectColor = [UIColor blueColor];
...属性很多
LWSegmentBar *bar = [LWSegmentBar segmentBarWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 64) segmentBarConfig:config];
- 使用链式编程de效果
// 主要代码
@interface LWSegmentBarConfig : NSObject
- (LWSegmentBarConfig *(^)(UIColor *color))lw_itemNormalColor;
- (LWSegmentBarConfig *(^)(UIColor *color))lw_itemSelectColor;
@end
@implementation LWSegmentBarConfig
- (LWSegmentBarConfig *(^)(UIColor *color))lw_itemNormalColor {
return ^(UIColor *color) {
self.itemNormalColor = color;
return self;
};
}
- (LWSegmentBarConfig *(^)(UIColor *color))lw_itemSelectColor {
return ^(UIColor *color) {
self.itemSelectColor = color;
return self;
};
}
@end
// 使用演示
LWSegmentBar *bar = [XMGSegmentBar segmentBarWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 64)];
[bar lw_updateConfig:^(LWSegmentBarConfig *config) {
config.lw_itemNormalColor([UIColor lightGrayColor]).lw_itemSelectColor([UIColor blueColor]);
}];
网友评论