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

原文出处: Yangcs(Yangcs)  编程

简介

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

配图架构

做为一个iOS 开发者,那么你必定用过Masnory/ SnapKit;框架

  • Masonry是一个OC开发中,很是好用的自动布局的第三方框架;函数式编程

  • SnapKit是Masonry团队打造的swift版本的自动布局框架;
    若是你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点“赞”!函数

一个典型的Masonry的语句:

 

 

 

1布局

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

 

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

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

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

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

  1. 新建项目command +shift + N

  2. 建立一个Person类
    并为其增长两个方法

     

     

    1

    2

      - (void)run;

      - (void)study;


    简单实现:

     

     

    1

    2

    3

    4

    5

    6

      - (void)run{

       NSLog(@"run");

      }

      - (void)study {

       NSLog(@"study")

      }

  3. 实例化并调用相关的方法

     

     

    1

    2

    3

    Person*person = [[Personalloc]init];

    [personrun];

    [personstudy];


    以上三步实现了一个很是简单的程序;

最终目标

 

 

 

1

2

    person.runBlock().studyBlock().runBlock();

    person.studyBlock().studyBlock().runBlock();

 

分解目标
1.先实现这种方式调用

 

 

 

1

      [[person run1] study1];

 

2.再实现最终目标

显然,若是想要实现[person run1]调用一个方法,那么run1就须要一个返回一个对象,让这个对象去调用study1。
这样分析后,就简单了,就是增长一个返回值。

代码
方法的声明

 

 

 

1

2

-(Person*)run1;

-(Person*)study1;

 

方法的实现

 

 

 

1

2

3

4

5

6

7

8

- (Person*)run1 {

        NSLog(@"run");

        return [[Personalloc] init];

}

- (Person*)study1{

         NSLog(@"study");

         return[[Personalloc]init];

}

 

实现最终目标:

 

 

 

1

    person.runBlock().studyBlock().runBlock();

 

在OC中,`()`block是以()的形式去执行的,猜测若是返回一个block的话,那么我就能够用()来实现runBlock()这种效果了吧!
再结合咱们的分解步骤,runBlock()表明执行了一个block,若是这个block的返回值的是一个对象的话,那么调用另一个方法;这样就能够一直连接下去吧!实现了咱们想要的目标!

代码:
声明

 

 

 

1

2

- (Person* (^)())runBlock;

- (Person* (^)())studyBlock;

 

实现:

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

- (Person* (^)())runBlock {  

       Person* (^block)() = ^() {            

                NSLog(@"run");          

               return self;        

        };      

       return block;

}

- (Person* (^)())studyBlock {

       Person* (^block)() = ^()  {            

              NSLog(@"study");

              return self;        

       };

        return block;

}

 

再来看一下Masonry的一个函数式编程

 

 

 

1

make.right.equalTo(self.right).insets(kPadding);

 

最终调用的函数:
返回的就是一个返回值为MASConstraint的block

 

 

 

1

2

3

4

5

- (MASConstraint* (^)(id))equalTo {  

return ^id(idattribute) {              

      return self.equalToWithRelation(attribute,NSLayoutRelationEqual);

    };

}

 

函数式编程总结

  • 若是想再去调用别的方法,那么就须要返回一个对象;

  • 若是想用()去执行,那么须要返回一个block;

  • 若是想让返回的block再调用对象的方法,那么这个block就须要返回一个对象(即返回值为一个对象的block)。

响应式编程的概念

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

在上篇博客中《iOS-Reactive Cocoa的常见用法》
Reactive Cocoa就是一个响应式编程的经典做品!

 

问啊-定制化IT教育平台,牛人一对一服务,有问必答,开发编程社交头条 官方网站:www.wenaaa.com

QQ群290551701 汇集不少互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!

相关文章
相关标签/搜索