美文网首页
链式编程

链式编程

作者: RichieQ | 来源:发表于2018-12-21 15:46 被阅读0次

    一、原理

    首先获得实例中的一个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);

    相关文章

      网友评论

          本文标题:链式编程

          本文链接:https://www.haomeiwen.com/subject/mkomkqtx.html