谈到链式编程,那Masonry几乎就是最经典的代表.如:

make.top.equalTo(self.view).offset()

像这样top.equalTo(self.view).offset(60)通过”点”语法,将需要执行的代码块连续的书写下去,就是链式编程.它能使代码简单易读,书写方便


1.传统写法,两个方法需要单独调用,也不能任意组合顺序

创建Person类

Person.h:

- (void)eat1;
- (void)sleep1;
Person.m:

- (void)eat1
{
NSLog(@"%s",__FUNCTION__);
}
- (void)sleep1
{
NSLog(@"%s",__FUNCTION__);
}

控制器中调用Person类中方法

ViewController.m:

Person *person = [[Person alloc] init];
[person eat1];
[person sleep1];

2.用’[]’实现连续调用

Person.h:

- (Person *)eat2;
- (Person *)sleep2;
Person.m:

- (Person *)eat2
{
NSLog(@"%s",__FUNCTION__);
return self;
}
- (Person *)sleep2
{
NSLog(@"%s",__FUNCTION__);
return self;
}
ViewController.m:

[[person eat2] sleep2];
[[person sleep2] eat2];
 

3.用block实现链式

//person.eat3相当于get方法(很妙的自己可以试一下)

Person.h:

- (void (^)())eat3;
- (void (^)())sleep3;
Person.m:

- (void (^)())eat3
{
//定义block
void (^eat3Block)() = ^ {
NSLog(@"%s",__FUNCTION__);
};
return eatBlock;
}
- (void (^)())sleep3
{
return ^ {
NSLog(@"%s",__FUNCTION__);
};;
}
ViewController.m:

person.eat3();
person.sleep3();
 

4.实现 链式(无参)

Person.h:

- (Person * (^)())eat4;
- (Person * (^)())sleep4;
Person.m:

- (Person *(^)())eat4
{
Person * (^eat4Block)() = ^ {
NSLog(@"%s",__FUNCTION__);
return self;
};
return eat4Block;
}
//上下两种写法一样
- (Person *(^)())sleep4
{
return ^ {
NSLog(@"%s",__FUNCTION__);
return self;
};
}
ViewController.m:

person.eat4().sleep4();
person.sleep4().eat4();

5.实现 链式(带参)

//person.eat3相当于get方法(很妙的自己可以试一下) 返回值是block  调用block需要传参数 int  调用block返回值是对象本身

Person.h:

- (Person * (^)(NSString *foodName))eat5;
- (Person * (^)(NSInteger hour))sleep5;
Person.m:

- (Person *(^)(NSString *))eat5
{
Person * (^eat5Block)() = ^(NSString *foodName) {
NSLog(@"吃: %@",foodName);
return self;
};
return eat5Block;
}
//上下两种写法一样
- (Person *(^)(NSInteger))sleep5
{
return ^(NSInteger hour) {
NSLog(@"睡了%ld小时",(long)hour);
return self;
};
}
ViewController.m:

person.eat5(@"蛋糕").sleep5();
person.sleep5().eat5(@"面包");



 

最新文章

  1. Sql Server函数全解<一>字符串函数
  2. JS中的原型继承机制
  3. Hack其实是一门好语言
  4. LeetCode "Binary Tree Vertical Order"
  5. Puppet安装与配置简介(附视频教程)
  6. iOS开发——实用技术OC篇&8行代码教你搞定导航控制器全屏滑动返回效果
  7. REST Design Concerns
  8. vmware安装 ios10.8 过程
  9. 2016021801 - Java内存区域学习笔记
  10. Windows 2012 AD配置
  11. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
  12. layui导航栏和layui.layui.msg问题
  13. python 操作手机
  14. tasksetCPU亲和力&docke容器资源限制
  15. [UI] 02 - Layout & CSS3
  16. SpringMVC---400错误The request sent by the client was syntactically incorrect ()
  17. javascript中函数作用域和声明提前
  18. kettle教程二
  19. 下载YouTube视频的方法
  20. 从Oracle到MySQL,余额宝云实践分享

热门文章

  1. (笔记)Linux内核中内存相关的操作函数
  2. Xianfeng轻量级Java中间件平台:功能管理
  3. MyBatis批量增删改的另外一种思路(推荐)
  4. php + crontab 执行定时任务
  5. phd文献阅读日志-博一上学期
  6. “A configuration with this name already exists” error in eclipse run configurations
  7. 'AndroidManifest.xml' must have a minimum of 2 segments.
  8. 安装配置和使用HBASE Cluster(基于发行版CDH5.0.2)——系列随笔
  9. A potentially dangerous Request.Path value was detected from the client异常解决方案
  10. 【spark】with mongodb