Masonry源码阅读笔记——使用Block实现链式编程

导语: 前段时间在阅读Masonry源码时,看到其内部使用了链式编程,比较有趣,这里简单分享一下;

在OC中实现链式编程并不难,最常用的实现是使用Block,具体包括以下几个要点:

1)对于要实现链式编程的函数,使用Block作为其返回值;

2)作为返回值的Block,需在执行后Return自身;

这里看起来似乎不太好理解,下面通过一个例子来说明:

@interface Box : NSObject

- (Box *(^)(CGFloat width))setWidth;
- (Box *(^)(CGFloat height))setHeight;
- (Box *(^)())setProperty;
- (Box *(^)())build;

@end

@implementation Box

- (Box *(^)(CGFloat width))setWidth {
    return ^(CGFloat width){
        NSLog(@"Set width : %f.", width);
        return self;
    };
}

- (Box *(^)(CGFloat height))setHeight {
    return ^(CGFloat height){
        NSLog(@"Set height : %f.", height);
        return self;
    };
}

- (Box *(^)())setProperty {
    return ^{
        NSLog(@"Set other property.");
        return self;
    };
}

- (Box *(^)())build {
    return ^{
        NSLog(@"A box is built.");
        return self;
    };
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Box *box = [Box new];
        box.setWidth(10.f).setHeight(10.f).setProperty().build();
    }
    return 0;
}

 在对象通过点语法调用函数时,返回了一个Block,在执行Block后,又返回了对象本身,这样就能将多个函数调用串联起来,实现链式的效果;

代码执行后为:

当然,链式编程很多时候并没有实际意义,例如上面的Demo,完全可以采用下面的实现:

@interface Box : NSObject

- (Box *)setWidth:(CGFloat)width;
- (Box *)setHeight:(CGFloat)height;
- (Box *)build;

@end

@implementation Box

- (Box *)setWidth:(CGFloat)width {
    NSLog(@"Set width : %f.", width);
    return self;
}

- (Box *)setHeight:(CGFloat)height {
    NSLog(@"Set height : %f.", height);
    return self;
}

- (Box *)build {
    NSLog(@"A box is built.");
    return self;
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Box *box = [Box new];
        [[[box setWidth:10.f] setHeight:10.f] build];
    }
    return 0;
}

但这样写一开始还能接受,链条一长时就会出现一堆恶心的中括号,这也是OC一直让人诟病的点;使用Block,形式上会美观许多;

当然,一般情况下还是不推荐链式编程的,因为这么写除了美观外毫无意义(个人愚见);但对于一些特殊的情况,例如使用Bulider模式,这么写可以使代码可读性更好,所以说,具体做法还是要视情况而定;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ytkah

css继承样式怎么控制?用选择器

  css样式继承性是指下级的样式属性会继承上级的属性,通俗点讲是儿子来继承父亲的属性,比如li会继承ul的属性。css继承原理是我们设置上级(父级)的CSS样...

2585
来自专栏前端布道

CSS选择器详解

最近在做一些面试的工作,我经常会问的一个问题就是:CSS中有哪些选择器。我往往得到的答案就是id选择器啊、class选择器啊,再追问下去就没了,这让我很是意外!...

2974
来自专栏葡萄城控件技术团队

深入CSS,让网页开发少点“坑”

 通常我们在学习CSS的时候,感觉语法很容易掌握,实际应用中却碰到各式各样难以填补的“坑”,为避免大家受到同样的困惑与不解,本文详细讲解了CSS中优先级和Sta...

1749
来自专栏cnblogs

深入理解及应用Position

position俗称定位,主要取值及作用如下: static 默认值。没有定位,出现在正常文档流中 absolute 绝对定位,相...

1846
来自专栏用户2442861的专栏

CSS浮动 (比较详细、生动、经典)

首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流。如下图:

542
来自专栏软件开发

CSS3与页面布局学习总结(三)——BFC、定位、浮动、7种垂直居中方法

一、BFC与IFC 1.1、BFC与IFC概要 BFC(Block Formatting Context)即“块级格式化上下文”, IFC(Inline For...

1788
来自专栏Java后端技术

CSS语法小记

    1.选择符(Selector):指明这组样式所要针对的对象。可以是一个XHTML标签,例如h1,img;也可以是定义了特定的id或者class的标签,如...

521
来自专栏编程

深入CSS,让网页开发少点“坑”

问题:我怎么才能收到你们公众号平台的推送文章呢? 通常我们在学习CSS的时候,感觉语法很容易掌握,实际应用中却碰到各式各样难以填补的“坑”,为避免大家受到同样的...

17910
来自专栏程序员互动联盟

css样式大全

字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD...

3174
来自专栏HTML5学堂

CSS选择器优先级

HTML5学堂:CSS优先级所谓优先级是指CSS样式在浏览器中被解析的先后顺序。 CSS选择器的优先级:id > class > tagname。具体我们来看看...

2603

扫码关注云+社区