作为一个iOS developer,那么你一定用过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 = [[Person
alloc]
init];
    [person
run];
    [person
study];

以上三步实现了一个非常简单的程序;

我们的最终目标
   
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 [[Person
alloc]
init];
       }
      -(Person
*)study1{
         
NSLog(@"study");
         
return
[[Person
alloc]
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(id
attribute) {

       
return
self.equalToWithRelation(attribute,
NSLayoutRelationEqual);

    };
}

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


响应式编程的概念

     在网上流传一个非常经典的解释`响应式编程的概念`
     在一般的程序开发中:
     a = b + c
     赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化
    响应式编程,目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化;
   
在上篇博客中《iOS-Reactive Cocoa的常见用法》http://blog.csdn.net/yang198907/article/details/50612652
Reactive Cocoa就是一个响应式编程的经典作品!


iOS-函数式编程 && 响应式编程概念的更多相关文章

  1. 函数式编程--响应式编程 ---android应用例子

    RxJava implements this operator as create. It is good practice to check the observer’s isUnsubscribe ...

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

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

  3. [HMLY]11.iOS函数式编程的实现&&响应式编程概念

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

  4. 函数式响应式编程 - Functional Reactive Programming

    我们略过概念,直接看函数式响应式编程解决了什么问题. 从下面这个例子展开: 两个密码输入框,一个提交按钮. 密码.确认密码都填写并一致,允许提交:不一致提示错误. HTML 如下: <input ...

  5. 【响应式编程的思维艺术】 (1)Rxjs专题学习计划

    目录 一. 响应式编程 二. 学习路径规划 一. 响应式编程 响应式编程,也称为流式编程,对于非前端工程师来说,可能并不是一个陌生的名词,它是函数式编程在软件开发中应用的延伸,如果你对函数式编程还没有 ...

  6. 函数响应式编程(FRP)思想-Callback风格

    序 ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP.FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁 ...

  7. RxJava(一):响应式编程与Rx

    一,响应式编程 响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式. 1.1 异步编程 传统的编程方式是顺序执行的,必须在完 ...

  8. Angular4学习笔记(五)- 数据绑定、响应式编程和管道

    概念 Angular中的数据绑定指的是同一组件中控制器文件(.ts)与视图文件(.html)之间的数据传递. 分类 流向 单向绑定 它的意思是要么是ts文件为html文件赋值,要么相反. ts-> ...

  9. spring5响应式编程

    1.Spring5新特性    2.响应式编程响应式编程:非阻塞应用程序,借助异步和事件驱动还有少量的线程垂直伸缩,而非横向伸缩(分布式集群)当Http连接缓慢的时候,从数据库到Http数据响应中也会 ...

随机推荐

  1. 八个开源的 Spring Boot 前后端分离项目,一定要收藏!

    八个开源的 Spring Boot 前后端分离项目 最近前后端分离已经在慢慢走进各公司的技术栈,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,我们也非常建议大家学习一下前 ...

  2. 如何发布自己用python写的py模块

    Python——怎么发布你的Python模块 我们在学习Python的时候,除了用pip安装一些模块之外,有时候会从网站下载安装包下来安装,我也想要把我自己编写的模块做成这样的安装包,该怎么办,如何发 ...

  3. python操作rabbitmq,实现生产消费者模型

    更多详情参考官方文档:https://www.rabbitmq.com/tutorials/tutorial-six-python.html 参考博客:https://blog.csdn.net/we ...

  4. nodejs server启动写法

    http://www.phpstudy.net/c.php/18720.html node不利用框架怎么实现对静态HTML.css.js的服务? 初学nodeJS,在使用nodejs构建静态文件服务器 ...

  5. 马兴德201771010117《面向对象程序设计(java)》第一周学习总结

    第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com 挽歌朽年 程序设计评测:https://pintia.cn/ 791683057@qq ...

  6. Java switch case语句

    switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. switch case 语句语法格式如下: switch(expression){ case value : ...

  7. SpringCloud(二)- Consul介绍、安装、使用

    唯能极于情,故能极于剑有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正,期待和大家一起学习交流 此文由四部分组成(Consul简介.安装.实操.总结),别着急,慢 ...

  8. RESTful api 功能测试

    0 为什么要写测试代码 代码写好了,如果能点或者能看,开发人员一般会自己点点或看看,如果没有发现问题就提交测试:更进一步,代码写好后,运行测试代码,通过后提交测试.将流程抽象下: 功能1编码-> ...

  9. [Python基础]007.字符串

    字符串 内建操作 字符串长度 大小写变换 去空格或其他 连接字符串 查找替换 分割 判断 内建操作 字符串长度 len 代码 s = 'abcd' print len(s) 大小写变换 lower 小 ...

  10. 【Python】基础总结

    输入 input("提示性信息") 如: input("请输入数字") 评估函数 因为 Python 没有特别人为规定数据类型,数据类型是由计算机进行判定,所以 ...