简介

本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助。

作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit;

    • Masonry是一个OC开发中,非常好用的自动布局的第三方框架;
    • SnapKit是Masonry团队打造的swift版本的自动布局框架;
      如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点“赞”!

一个典型的Masonry的语句:

make.centerY.equalTo(self.view).offset(100);

就是这个“.”让Masonry更加鲜活的展示给了开发者,在我心中
Masnory/ SnapKit函数式编程的一个经典的代表作,非常值得参考和学习!

链式编程的好处不用再说了,用过Masnory/ SnapKit的都知道;

那么问题来了,怎么写链式编程呢?

一步步来实现一个函数式编程

    1. 新建项目command +shift + N
    2. 创建一个Person类
      并为其增加两个方法
 - (void)run;
- (void)study;
简单实现:
- (void)run{
NSLog(@"run");
}
- (void)study {
NSLog(@"study")
}
3.实例化并调用相关的方法
 Person*person = [[Personalloc]init];
[personrun];
[personstudy];
以上三步实现了一个非常简单的程序; 最终目标
person.runBlock().studyBlock().runBlock();
person.studyBlock().studyBlock().runBlock();
分解目标
1.先实现这种方式调用
[[person run1] study1];

2.再实现最终目标
显然,如果想要实现[person run1]调用一个方法,那么run1就需要一个返回一个对象,让这个对象去调用study1。
这样分析后,就简单了,就是增加一个返回值。 代码
方法的声明
-(Person*)run1;
-(Person*)study1;
方法的实现
- (Person*)run1 {
NSLog(@"run");
return [[Personalloc] init];
}
- (Person*)study1{
NSLog(@"study");
return[[Personalloc]init];
}

实现最终目标:

    person.runBlock().studyBlock().runBlock();
在OC中,block是以()的形式去执行的,猜想如果返回一个block的话,那么我就可以用()来实现runBlock()这种效果了吧!
再结合我们的分解步骤,runBlock()代表执行了一个block,如果这个block的返回值的是一个对象的话,那么调用另外一个方法;这样就可以一直链接下去吧!实现了我们想要的目标! 代码:
声明
- (Person* (^)())runBlock;
- (Person* (^)())studyBlock;
实现:
 - (Person* (^)())runBlock {
Person* (^block)() = ^() {
NSLog(@"run");
return self;
};
return block;
}
- (Person* (^)())studyBlock {
Person* (^block)() = ^() {
NSLog(@"study");
return self;
};
return block;
}

再来看一下Masonry的一个函数式编程
make.right.equalTo(self.right).insets(kPadding);

最终调用的函数:
返回的就是一个返回值为MASConstraint的block
- (MASConstraint* (^)(id))equalTo {
return ^id(idattribute) {
return self.equalToWithRelation(attribute,NSLayoutRelationEqual);
};
}

函数式编程总结

  • 如果想再去调用别的方法,那么就需要返回一个对象;
  • 如果想用()去执行,那么需要返回一个block;
  • 如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。

响应式编程的概念

在网上流传一个非常经典的解释`响应式编程的概念`
在程序开发中:
a = b + c
赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化
响应式编程,目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化;

[HMLY]11.iOS函数式编程的实现&&响应式编程概念的更多相关文章

  1. 深入浅出-iOS函数式编程的实现 && 响应式编程概念

    简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 配图 ...

  2. iOS开发之OC篇-响应式编程Reactive Cocoa

    一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...

  3. 学习响应式编程 Reactor (1) - 响应式编程

    响应式编程 命令式编程(Imperative Programing),是一种描述计算机所需做出的行为的编程范式.详细的命令机器怎么(How)去处理以达到想要的结果(What). 声明式编程(Decla ...

  4. 使用ReactiveCocoa实现iOS平台响应式编程

    使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Prog ...

  5. [转]使用ReactiveCocoa实现iOS平台响应式编程

    原文:http://www.itiger.me/?p=38 使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍 ...

  6. [iOS] 响应式编程开发-ReactiveCocoa(一)

    什么是响应式编程 响应式编程是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播. 例如,在命令式编程环境中 ...

  7. 函数响应式编程(FRP)—基础概念篇

    原文出处:http://ios.jobbole.com/86815/. 一函数响应式编程 说到函数响应式编程,就不得不提到函数式编程,他们俩有什么关系呢?今天我们就详细的解析一下他们的关系. 现在下面 ...

  8. 函数响应式编程(FRP)从入门到”放弃”——基础概念篇

    前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...

  9. 【响应式编程的思维艺术】 (2)响应式Vs面向对象

    目录 一. 划重点 二. 面向对象编程实例 2.1 动画的基本编程范式 2.2 参考代码 2.3 小结 三. 响应式编程实现 四. 差异对比 4.1 编程理念差异 4.2 编程体验差异 4.3 数学思 ...

随机推荐

  1. SSMS2008插件开发(3)--部署调试SSMS2008插件

    原文:SSMS2008插件开发(3)--部署调试SSMS2008插件 上一次说到VS2008中的插件开发,最终结果插件是部署在VS2008中,现在我们将插件部署到SSMS2008(Microsoft ...

  2. CF:Problem 427C - Checkposts良好的沟通 Tarjan算法

    tarjan算法的第一个问题 喷我的脸....手写叠式开成BOOL,我一直在找错了... #include<cstdio> #include<cstring> #include ...

  3. android shape总结 和控制的风格定制

    1:shape总结 1):shape文件是放置在drawable文件下的.res/drawable/filename.xml. 2):shape类型:android:shape. 一共同拥有四种:re ...

  4. win7 Python 环境 准备 配置

    包括Python,eclipse,jdk,pydev,pip,setuptools,beautifulsoup,pyyaml,nltk,mysqldb的下载安装配置. **************** ...

  5. 10 Super Useful Tools for Web Designers

    36个扁平化设计的iphone和ipad应用界面设计案例 http://designwoop.com/2014/04/36-examples-of-flat-iphone-and-ipad-appli ...

  6. 深入理解javascript new的机制

    我们在使用对象的时候,除了一些浏览器内置的单体对象可以直接使用外,都会new一个出来使用. 1.最简单的莫过于如下获取一个Object对象实例 var obj = new Object(); 说明:此 ...

  7. Android开发Tips-1

    打算记录一些自己在开发过程中遇到的一些技巧性代码,方便以后遇到相似功能时能够快速的找到,那就从这里开始吧. 1,如何截取当前屏幕(不包括当前Activity的Title)并分享: a,获取当前Acti ...

  8. Web Components

    Web Components是不是Web的未来   今天 ,Web 组件已经从本质上改变了HTML.初次接触时,它看起来像一个全新的技术.Web组件最初的目的是使开发人员拥有扩展浏览器标签的能力,可以 ...

  9. Webapi备忘-20140109

    r01的翻译系列:http://www.cnblogs.com/r01cn/category/428069.html 接收FROM数据 Webapi接收表单数据,如果有多个数据比如x=1&y= ...

  10. Trie字典树算法

    特性 Trie树属于树形结构,查询效率比红黑树和哈希表都要快.假设有这么一种应用场景:有若干个英文单词,需要快速查找某个单词是否存在于字典中.使用Trie时先从根节点开始查找,直至匹配到给出字符串的最 ...