美文网首页iOS收藏iOS相关超棒文集
深入浅出-iOS函数式编程的实现 && 响应式编

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

作者: Yangsc_o | 来源:发表于2016-02-21 11:27 被阅读15525次


    简介

    本篇主要回顾一下--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")
         }
    
    1. 实例化并调用相关的方法
        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 的数值会同时发生变化;

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

    相关文章

      网友评论

      • 可以叫我汤包呀:符合标题 深入浅出
      • 强子ly:这个真是深入浅出了哈,通俗易懂,赞一个
      • 开飞机的叔客:函数式和链式好像有点混乱
      • wokenshin:链式调用 说的浅显易懂 感谢 分享
      • JABread:只能说浅出吧…
      • 麟young:很显然混淆了函数式编程和链式编程的概念,建议先看下http://www.jdon.com/functional.html这篇文章再发文章定义概念~
      • 一粒咸瓜子:请大神指教一下,为什么一个方法返回block,它就能用点语法进行调用了?在OC中调用方法不是使用[ ]吗?
        麟young: 类似属性的Get方法返回字符串或数组一样,这里返回的是一个block类型,这个类型的名字叫做“返回值为对象且含有一个参数值的block类型”,只不过看起来有点复杂~ 属性的点语法可以直接调用其Get方法,这里同理。
      • Noah1985:如果不打着函数式做幌子的话文章不错
        大胆造轮子:@iOS音视频
        虽然都两者都是基于block实现的;
        函数式:person.runBlock();//类似一次函数调用;函数式不一定返回对象本身,于是此时就不能和链式同时使用了
        函数式+链式:person.runBlock().studyBlock().runBlock();// 函数式的特例吧,返回对象本身就可以实现链式了
        Yangsc_o:愿听指教 ,你对函数式编程的理解是?
      • 冰三尺:我有一个问题对于这个 方法
        - (Person* (^)())runBlock;
        在OC中调用方法使用[person runBlock ], 而是person.runBlock() ?
        大胆造轮子:链式编程 就是 函数式编程?扯淡
        冰三尺:@大米大爷 明白了,多谢
        大米大爷:@里脊糖醋感觉这个方法的返回值是block然后调用这个block的返回值是对象,对象又可以调用方法所以可以一直链式下去
      • 虚心若愚:不错, 简单的几个例子就把原理讲清楚了。
      • 付寒宇:有所收益非常感谢。
      • 路过河边:需要的就是这种思想 非常好
      • KevinTing:写的很好!
        Yangsc_o:@KevinTing 谢谢
      • 杂食:这个排版有问题吧?
      • iOS程序犭袁:学习下
        iOS程序犭袁:@Yangcs 😀
        Yangsc_o:@iOS程序犭袁 多向 微博中 #iOS开发教程# 话题 学习才是 :+1: 感谢主持人

      本文标题:深入浅出-iOS函数式编程的实现 && 响应式编

      本文链接:https://www.haomeiwen.com/subject/sogvkttx.html