链式编程

2018-12-21  本文已影响0人  RichieQ

一、原理

首先获得实例中的一个block,然后执行block并返回实例本身,然后再执行实例的另一个block,而在这个block中同样返回实例本身,按此规律通过点语法一直往下执行

二、代表库

1、SDAutoLayout 基于frame自动布局方式
2、BabyBluetooth 基于原生CoreBluetooth框架封装的轻量级开源库
3、Masonry 基于原生NSLayoutConstraints约束封装的轻量级开源库
4、等等

三、例子摘自SDAutoLayout部分代码

1、block

typedef SDAutoLayoutModel *(^MarginToView)(id viewOrViewsArray, CGFloat value);

2、类

@interface SDAutoLayoutModel : NSObject
/** 左边到其参照view之间的间距,参数为“(View 或者 view数组, CGFloat)”  */
@property (nonatomic, copy, readonly) MarginToView leftSpaceToView;
/** 顶部到其参照view之间的间距,参数为“(View 或者 view数组, CGFloat)”  */
...
@end

@implementation SDAutoLayoutModel

- (MarginToView)leftSpaceToView
{
    if (!_leftSpaceToView) {
        _leftSpaceToView = [self marginToViewblockWithKey:@"left"];
    }
    return _leftSpaceToView;
}

- (MarginToView)marginToViewblockWithKey:(NSString *)key
{
    __weak typeof(self) weakSelf = self;
    return ^(id viewOrViewsArray, CGFloat value) {
        SDAutoLayoutModelItem *item = [SDAutoLayoutModelItem new];
        item.value = @(value);
        if ([viewOrViewsArray isKindOfClass:[UIView class]]) {
            item.refView = viewOrViewsArray;
        } else if ([viewOrViewsArray isKindOfClass:[NSArray class]]) {
            item.refViewsArray = [viewOrViewsArray copy];
        }
        [weakSelf setValue:item forKey:key];
        return weakSelf;
    };
}
...
@end

3、调用

SDAutoLayoutModel *model = [SDAutoLayoutModel new];
model.leftSpaceToView(view, 10)
     .topSpaceToView(view, 16);
上一篇下一篇

猜你喜欢

热点阅读