1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数  > 链式编程思想

2. 使用block当函数的返回参数

// 之前开发中比较习惯,把事情封装到一个方法中,

// 链式编程思想:把要做的事情封装到block,给外界提供一个返回这个Block的方法

// 链式编程思想方法特点:方法返回值必须是block,block参数:放需要操作的内容,block返回值:方法调用者

- (void)viewDidLoad {

[super viewDidLoad];

UIView *redView = [[UIView alloc] init];

redView.backgroundColor = [UIColor redColor];

[self.view addSubview:redView];

void(^block)(MASConstraintMaker *maker) = ^(MASConstraintMaker *make) {

// 描述控件的所有约束

// 上下左右间距都为10

// make.left 返回值-> MASViewConstraint

// make.left.top:把左边和顶部的约束全部保存到make.contrains

// equalTo:方法

// equalTo返回值:block

id(^block)(id attribute) = ^id(id attribute) {

//   return self.equalToWithRelation(attribute, N

//   SLayoutRelationEqual);

return nil;

};

block(@10);

// equalTo(@10)返回值 =  self.equalToWithRelation(attribute, NSLayoutRelationE qual);

make.left.top.equalTo(@10);

make.right.bottom.equalTo(@(-10));

};

// 参数:block

[redView mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.top.equalTo(@10);

make.right.bottom.equalTo(@(-10));

}];

// mas_makeConstraints作用: 给控件设置布局, 把控件的所有约束保存到约束制造者中.

    // - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block

    // 1.创建一个约束制造者

    // 2.调用block(maker),把所有的控件的约束全部保存到约束制造者

    // 3.[constraintMaker install]:遍历约束制造者的所有约束给控件添加约束

}

计算加法为例:

 1.创建一个计算者的类

- (CaculatorMaker * (^)(int num))add

{

return ^(int num){

_result += num;

return self;

};

}

2.写一个继承NSObject的类 仿Masonry的方法写一个自己的方法:+ (int)makeCaculator:(void (^)(CaculatorMaker *))block

#import "NSObject+Caculator.h"

#import "CaculatorMaker.h"

@implementation NSObject (Caculator)

+ (int)makeCaculator:(void (^)(CaculatorMaker *))block

{

// 创建计算制造者

CaculatorMaker *maker = [[CaculatorMaker alloc] init];

// 计算

block(maker);

return maker.result;

}

@end

3. 直接使用链式编程

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

// add(1).add(2)

// 1.创建计算制造者

CaculatorMaker *maker = [[CaculatorMaker alloc] init];

// 10 + 20 + 30 + 40

// 链式编程思想: maker.add(10).add(20).add(30).add(40)

// int result = [maker.add(10).add(20).add(30).add(40) result];

//   提供一个没参数的add方法,返回值block

//   int reslut = [[[[[maker add:10] add:20] add:30] add:40] result];

//   block:使代码高聚合

int result = [NSObject makeCaculator:^(CaculatorMaker *maker) {

// 把所有的计算代码封装到这里

maker.add(10).add(20);

maker.add(30).add(40);

maker.multy(3);

}];

NSLog(@"%d",result);

}

总结:用Block实现链式编程无非就是:方法的返回值是一个Block,

Block内部装着真正要执行的方法,Block内部再返回self;

     如果有参数,通过Block的参数往里传.

- ( 返回值是Block ) 方法名

{

    return *{

      Block内部装着真正要执行的代码

      return self;

    };

}

ios的链式编程笔记的更多相关文章

  1. iOS开发技巧系列---使用链式编程和Block来实现UIAlertView

    UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...

  2. iOS利用block实现链式编程方法(Objective-C链式编程)

    objc利用block实现链式编程方法 因为不好读.block和其他语言的匿名函数一样,很多程序员刚开始很难主动去用他. 本文描述block作为属性的实际使用,看懂block,并讲解如何利用block ...

  3. iOS 开发之使用链式编程思想实现简单的计算器

    链式编程思想是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.例如 a(1).b(2).c(3). 链式编程思想最为关键的是,方法的返回值是block,block必须返回对 ...

  4. iOS 链式编程探索(Masonry)

    看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...

  5. iOS:用Block写一个链式编程

    一.介绍 链式编程是一个比较新颖的编程方式,简单直观,用起来也比较舒服.目前比较有名的Mansory和BabyBlueTooth就是使用链式编程写的第三方框架. 二.写法 链式编程写法不同于传统方式, ...

  6. 实现iOS中的链式编程

    谈到链式编程,那Masonry几乎就是最经典的代表.如: make.top.equalTo(self.view).offset() 像这样top.equalTo(self.view).offset(6 ...

  7. iOS端JSON转Model链式编程框架SuperKVC使用方法与原理

    背景 在client编程中.字典转模型是一个极为常见的问题,苹果提供了KVC来实现NSDictionary到Model的注入,可是KVC仅仅能进行单层浅注入.且无法处理类型转换.key与属性名不正确应 ...

  8. 响应式编程笔记三:一个简单的HTTP服务器

    # 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...

  9. Unity 游戏框架搭建 (十八) 静态扩展 + 泛型实现transform的链式编程

    本篇文章介绍如何实现如下代码的链式编程: C# this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity); ...

随机推荐

  1. composer环境配置

    一 下载composer.phar http://pan.baidu.com/s/1nuDQBzz cmd命令行切换到composer.phar文件目录下 运行: echo @php "%~ ...

  2. keepalived安装

    两台虚拟机 两台配置操作一样 环境配置 [root@lb01 /]# yum -y install openssl openssl-devel [root@lb01 /]# yum -y instal ...

  3. JQuery选择器细节-遁地龙卷风

    1.层次选择器-子元素选择器 <body> <div> <p>lol</p> <div> <p></p> </ ...

  4. BZOJ2171——K凹凸序列

    好吧,我承认是sb题QAQ BZOJ2171弱化版QAQ 这题考试的时候写的我快吐血了QAQ 0.题目大意:给一个序列,你可以随便修改,修改是将一个数+1或-1,一次修改的代价是1,问把这个数修改成x ...

  5. javax.swing.JList 设置分割线

    public class TestJList extends JFrame { public TestJList() { JList list = new JList(new String[] { & ...

  6. OpenCV成长之路(4):图像直方图

    一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图 ...

  7. H5canvas赛车游戏-基于lufylegend引擎

    lufylegend引擎是canvas游戏中,比较简单的引擎之一,它不需要配置环境,类似引入jquery包的方式,引用对应js文件即可 lufylegend官方网站:http://www.lufyle ...

  8. 这些情况下onReume不应该是你的选择

    面试Android程序员的时候问过以下几个基本问题,得到的回答经常不尽人意: 1, Activity A跳转到Activity B,Activity B完成后,Activity A要刷新一下自己的数据 ...

  9. BSON 1.0版本规范(翻译)

    BSON 1.0版本规范 本文翻译自 http://bsonspec.org/spec.html BSON是用于存储零个或多个键/值对为一个单一的实体的一个二进制格式.我们称这个实体为文档(Docum ...

  10. int *const && int const * && const int *的区别

    ANSIC允许声明常量,常量和变量不同,常量就是不可以改变的量,用关键字const来修饰 比如:const int a int const a 以上两种声明方式是一样的,我们不需要考虑const和in ...