OC中链式编程和函数式编程
最近看到了链式编程和函数式编程这两个概念,这两天不是那么的忙 所以也研究了下这两个概念;
在查询链式编程和函数式编程的概念时突然想到了链式编程和函数式编程最典型的代表是Masonry 比较完美的实现了函数式编程和链式编程 例如
[viewOne mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view).offset(100);
make.centerX.equalTo(self.view.mas_centerX).offset(100);
make.height.mas_equalTo(100);
make.width.mas_equalTo(100);
}];
其实 仔细考虑了下 所谓的链式编程其实就是 在返回值的基础上 继续调用方法,那么问题来了 什么样的返回值才能调用方法 答案是 对象 只要返回对象 然后调用对应的对象方法即可实现 链式编程 例如 最简单的链式编程
- (Person *(^)())eat3;
- (Person *(^)())run3;
[[person eat]run];
这样的链式编程 和Masonry 确实有点相差甚远
我们知道在OC中的方法调用是 发送消息的方式实现的那么 要实现 person.eat 该怎么实现呢?
那么我们就想到了 Xcode的编译器特性 类似于 getter 和setter方法,尤其是getter方法 就是将 NSString *nameOne = peron.name 转化成了 NSString *nameOne = [peron name] 那么类似的做法 我们是不是可以将 方法调用写成 : person.eat呢?答案是可以的 但是这样是有警告的但是 可以运行 那么只要我的eat 方法的返回值是Person 类对象 那么我就可以实现链式编程 ,但是这样写又没有什么意义,我们观察Maronry中是将函数式编程和链式编程结合起来使用的那么我们先了解下OC中的函数式编程的实现
先介绍下 函数式编程 然后慢慢过渡到链式编程
首先所谓函数式编程 就是通过类似于 函数调用的方式实现想要的功能即 method(); 这样的方式,
那么我们知道在OC能用method() 这样调用,只有一个可以实现,那就是BLOCK, 我们在调用BLOCK时 不就是这样调用的吗? 那么我们知道只要我的一个方法的返回值是BLOCK的时候就可以使用函数式调用了例如
- (void(^)())eat2;
- (void(^)())run2;
- (void (^)())eat2 {
return ^{
NSLog(@"block === %s",__func__);
};
}
- (void (^)())run2 {
return ^(){
NSLog(@"block == %s",__func__);
};
}
但是这样具有局限性就是只能调用一次
person.eat2();
person.run2();
不能实现 person.eat2().run2();
那么我们猜想了只要eat2中block的返回值是Person类对象 是不是就可以实现了呢?
于是 测试例子
- (Person *(^)())eat3;
- (Person *(^)())run3 ;
- (Person *(^)())eat3 {
return ^(){
NSLog(@"block == %s",__func__);
returnself;
};
}
- (Person *(^)())run3 {
return ^{
NSLog(@"block ==== %s",__func__);
returnself;
};
}
此时就可以实现 person.eat3().run3(); 此时距离Masonry的样式就越来越接近了
那么我们知道 无论是eat3还是run3 的返回值是 返回Person类型的block,当我们 person.run3()时就是调用了run3返回回来的block,那么我们知道了 当我们返回的block中带有参数 是不是就可以实现person.run3(参数).eat3(参数);
于是:
- (Person *(^)(NSString *food))eat4{
return ^(NSString *food){
NSLog(@"吃了%@",food);
returnself;
};
}
- (Person *(^)(int distance))run4 {
return ^(int distance){
NSLog(@"跑了%d米",distance);
returnself;
};
}
这样就可以实现
NSLog(@"=========");
person.eat4(@"大骨头").run4(10000);
NSLog(@"=========");
person.run4(200000).eat4(@"小鱼");
了
OC中链式编程和函数式编程相关推荐
- 链式编程和函数式编程
说起链式编程和函数式编程,小伙伴们千万不要紧张. 听着很高大尚,其实也就那么回事.相信有过C#开发经验的,或者其他编程经验的,只要不是OC,一看就知道. 看两行代码: 1 Person *person ...
- Python中的匿名函数和函数式编程
Python中的匿名函数和函数式编程 文章目录 Python中的匿名函数和函数式编程 一.匿名函数 匿名函数的格式: 二.函数式编程 map() filter() reduce() 区别 三.'三目运 ...
- 基于C++11模板元编程实现Scheme中的list及相关函数式编程接口
前言 本文将介绍如何使用C++11模板元编程实现Scheme中的list及相关函数式编程接口,如list,cons,car,cdr,length,is_empty,reverse,append,map ...
- java 函数式编程_函数式编程杂谈
比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算.本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处. 一 ...
- 几段小代码解释Python命令式编程和函数式编程
所谓命令式编程,是指How to do,要通过指令告诉计算机如何一步一步地完成预定任务:而所谓函数式编程,可理解为What to do,只需要通过简单的指令告诉计算机要做什么就可以了,代码更加简洁.易 ...
- 命令式编程与函数式编程
命令式编程 命令式编程(英语:Imperative programming),是一种描述电脑所需作出的行为的编程典范.几乎所有电脑的硬件工作都是指令式的:几乎所有电脑的硬件都是设计来运行机器码,使用指 ...
- java什么是函数式编程,Java 函数式编程(一)初识篇
本文已授权"后端技术精选"独家发布. 开发者使用Java8编写复杂的集合处理算法,只需要简单的代码就能在多喝cpu上高效运行,这就是Lambda表达式的初衷. 提示:函数式编程和语 ...
- 函数式编程,函数式编程信奉那棵动态的运动树
cpu是树的动力源. 面向结构编程,面向结构编程所信奉的是努力设计那棵静态的资源树,相信那棵静态的资源树的良好可以大大降低那棵动态的运动树的复杂度.因为系统的资源树已经被提前进行了良好的设计,从而可以 ...
- 1075: 动态规划入门(中链式2:能量项链)
1075: 动态规划入门(中链式2:能量项链) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 [问题描述] 能量球组成的项链.相邻两球可以合并产生新球.合并规则:如果前一颗能量珠的头标记 ...
- 响应式编程 函数式编程_函数式编程的基本原理简介
响应式编程 函数式编程 After a long time learning and working with object-oriented programming, I took a step b ...
最新文章
- java.lang.UnsupportedOperationException: Required method destroyItem was not overridden
- 【编译原理】关于NFA和DFA-集合定义的探索
- MyBatis代码生成器-Example讲解
- nexus 安装_Jenkins Pipelines将制品发布到Nexus存储库
- 图书资料管理课程设计(附源码和连接)
- Apache JMeter 下载
- juery-轮播图-原理与实现
- 有望年前发布?魅族16s Pro Plus曝光:下半年旗舰担当
- Linux 基础命令:IP 路由操作 -ip命令
- Django里面的sql查询语句
- 李阳疯狂英语900句 121-330
- java 多线程 银行排队_3.采用多线程模拟银行排队叫号
- 基于MSCNN的人群密度估计之数据集制作
- 同一操作系统中安装多个不同版本谷歌Chrome浏览器
- win7计算机属性资源管理器停止工作,Win7系统Windows资源管理器已停止工作怎么解决?...
- 华为光伏usb适配器_支持22.5W超级快充无线充电,华为P40手机保护壳深度拆解
- 你的另一半眼泪流给谁
- 牛津博士讲大数据和量化金融
- Verilog --状态机编码方式
- 家庭光纤宽带有必要升级千兆双频路由器吗?