说起链式编程和函数式编程,小伙伴们千万不要紧张。

听着很高大尚,其实也就那么回事。相信有过C#开发经验的,或者其他编程经验的,只要不是OC,一看就知道。

看两行代码:

1     Person *person = [[Person alloc] init];
2     person.run(9.2).eat(@"香蕉").run(1.2).eat(@"面条");

上面的就是链式编程+函数式编程。

来个大白话解释:看到括号里面的参数了吧,跟C的函数调用是不是很相似,包括别的语言,都用小括号传参,只有OC是冒号传参。

再看方法调用用的是".",而OC用的是[]+空格。

这几个方法调用,如果要按OC的打法,估计要整4行,对象一个一个的调用方法,但链式就是这么一行搞定。

我们来分析一下,在OC中,什么可以通过小括号()来传参呢,没错,那就是Block,调用Block的时候,blockName(para),就是这样。

所以,我们推断run(para)和eat(para)这两个方法,肯定返回值是一个Block,而且是带一个参数的Block。

那么通过 《点》 调用方法怎么解释呢? 点其实就是调用getter方法,所以run和eat方法没有参数,只有一个返回类型为Block的值。

而且,能一直点下去,说明什么呢,说明Block也有返回值啊,而且返回值的类型就是当前对象的类型。

哈哈,这下明白了吧。

原理说明白了,我们上代码吧:

Person类头文件:

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Person : NSObject
 4
 5 // 函数的返回值是一个Block,Block的返回值是当前对象,Block有一个参数
 6 - (Person *(^)(double distance))run;
 7
 8 // 函数的返回值是一个Block,Block的返回值是当前对象,Block有一个参数
 9 - (Person *(^)(NSString *food))eat;
10
11 @end

Person类的.m文件:

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 - (Person *(^)(double))run{
 6     // 方法的返回是一个”有参无返回值的Block“
 7     return ^(double distance){
 8         NSLog(@"跑:%f",distance);
 9         // block的返回值是当前对象
10         return self;
11     };
12 }
13
14 - (Person *(^)(NSString *))eat{
15     // 方法的返回是一个”有参无返回值的Block“
16     return ^(NSString *food){
17         NSLog(@"吃:%@",food);
18         // block的返回值是当前对象
19         return self;
20     };
21 }
22
23 @end

看到了吧,一定要看这2行注释,这可是整个的核心。

接下来,调用即可。

 1 #import "ViewController.h"
 2 #import "Person.h"
 3
 4 @interface ViewController ()
 5
 6 @end
 7
 8 @implementation ViewController
 9
10 - (void)viewDidLoad {
11     [super viewDidLoad];
12
13     Person *person = [[Person alloc] init];
14
15     // 这就是链式编程+函数式编程
16     person.run(9.2).eat(@"香蕉").run(1.2).eat(@"面条");
17 }
18
19 @end

转载于:https://www.cnblogs.com/panda1024/p/6031684.html

链式编程和函数式编程相关推荐

  1. java 函数式编程_函数式编程杂谈

    比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算.本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处. 一 ...

  2. 几段小代码解释Python命令式编程和函数式编程

    所谓命令式编程,是指How to do,要通过指令告诉计算机如何一步一步地完成预定任务:而所谓函数式编程,可理解为What to do,只需要通过简单的指令告诉计算机要做什么就可以了,代码更加简洁.易 ...

  3. 命令式编程与函数式编程

    命令式编程 命令式编程(英语:Imperative programming),是一种描述电脑所需作出的行为的编程典范.几乎所有电脑的硬件工作都是指令式的:几乎所有电脑的硬件都是设计来运行机器码,使用指 ...

  4. java什么是函数式编程,Java 函数式编程(一)初识篇

    本文已授权"后端技术精选"独家发布. 开发者使用Java8编写复杂的集合处理算法,只需要简单的代码就能在多喝cpu上高效运行,这就是Lambda表达式的初衷. 提示:函数式编程和语 ...

  5. 函数式编程,函数式编程信奉那棵动态的运动树

    cpu是树的动力源. 面向结构编程,面向结构编程所信奉的是努力设计那棵静态的资源树,相信那棵静态的资源树的良好可以大大降低那棵动态的运动树的复杂度.因为系统的资源树已经被提前进行了良好的设计,从而可以 ...

  6. 响应式编程 函数式编程_函数式编程的基本原理简介

    响应式编程 函数式编程 After a long time learning and working with object-oriented programming, I took a step b ...

  7. 响应式编程和函数式编程

    一.响应式编程(Reactive Programming,RP) 1.关键字 RxJava,观察者模式,EventBus,广播,Gateway 2.定义 响应式编程是一种面向数据流和变化传播的编程范式 ...

  8. 响应式编程 函数式编程_函数式编程简介

    响应式编程 函数式编程 根据您要求的对象, 函数式编程 (FP)是一种应运而生的开明编程方法,或者是一种在实践中几乎没有实际好处的过于学术化的方法. 在本文中,我将解释什么是函数式编程,探讨其好处,并 ...

  9. java函数式编程_Java 函数式编程和 lambda 表达式详解

    作者:DemonsI my.oschina.net/demons99/blog/2223079 为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要 ...

最新文章

  1. win10应用开发——如何判断应用是在手机上运行还是电脑上运行
  2. 问题Re-installation failed due to different application signatures.解决
  3. [BeiJing2010组队]次小生成树 Tree
  4. redis 一般启动几个 哨兵_Redis6.0主从、哨兵、集群搭建和原理
  5. Oracle ——如何确定性能差的 SQL
  6. 八皇后(N皇后)问题
  7. exchange 日常管理之八:合并用户邮箱
  8. javascript中的取input对象集合与php中取input数组的区别
  9. 用iMindMap制作健康生活计划思维导图
  10. 注册测绘师的学习笔记
  11. 用Excel和OutLook实现自动批量发邮件
  12. 树莓派 网络附加存储NAS系统和USB外接硬盘文件服务器
  13. 一文搞懂 FlinkSQL函数 LAST_VALUE 的原理
  14. 中国内地、台湾、香港、澳门和国外DNS服务器地址列表
  15. 2011年计算机类会议汇总
  16. java-老鼠出迷宫
  17. 教授专栏11|张处:企业支付政策和信用风险:来自信用违约掉期(CDS)市场的证据
  18. RabbitMQ确认应答和确认发布
  19. C/C++ 语言 const 关键字
  20. 免费英文写作批改网站

热门文章

  1. 局域网设备与公网服务之间如何交互数据?
  2. mysql 按照条件计数_灵活的CASE...WHEN:SQL同时按条件计数按条件加和
  3. 从源码分析RocketMQ系列-消息拉取PullMessageProcessor详解
  4. Laravel源码解析之Request
  5. 关于Zuul的几个问题
  6. NVIDIA PhysX宣布正式开源 最强物理仿真引擎
  7. 如何打造应对超大流量的高性能负载均衡?
  8. 利用TICK搭建Docker容器可视化监控中心
  9. Dagoin之modelform组件
  10. [总结]FFMPEG视音频编解码零基础学习方法--转