xml地图|网站地图|网站标签 [设为首页] [加入收藏]

必威函数式编程概念,链式编程

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

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

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

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

  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);
    };
}

响应式编程

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

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

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

  1. 新建项目command shift N
  2. 创建一个Person类
    并为其增加两个方法
 - (void)run;
  - (void)study;

简单实现:

 - (void)run{
   NSLog(@"run");
  }
  - (void)study {
   NSLog(@"study")
  }
  1. 实例化并调用相关的方法
 Person*person = [[Person alloc]init];
 [person run];
 [person study];

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

最终目标

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

分解目标

  1. 先实现这种方式调用
 [[person run1] study1];
  1. 再实现最终目标
    显然,如果想要实现[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(idattribute) {               
      return self.equalToWithRelation(attribute,NSLayoutRelationEqual);
    };
}

函数式编程总结

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

链式编程

将多个操作通过点号链接在一起成为一句代码 是代码可读性好 实例对象 .a(1).b(2)
特点: 方法的返回值是block,block必须有返回值(调用者本身对象),block参数( 需要操作的值)
代表作: masonry框架

 - run{ NSLog; } - study { NSLog }
一个典型的Masonry的语句:
make.centerY.equalTo(self.view).offset(100);

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

原文:http://www.jianshu.com/p/7017a220f34c

函数式编程

是把操作尽量写成一系列的嵌套函数或者方法调用
函数式编程本质: 就是往方法中传入block , 方法中嵌套block调用

如果想再去调用别的方法,那么就需要返回一个对象;
如果想用()去执行,那么需要返回一个block;
如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。
Reactive Cocoa就是一个响应式编程的经典作品!

 [[person run1] study1];
响应式编程的概念

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

简介

本篇主要回顾一下--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的都知道;

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

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

 Person*person = [[Personalloc]init]; [personrun]; [personstudy];

实现最终目标:

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

  • 如果想再去调用别的方法,那么就需要返回一个对象;
  • 如果想用()去执行,那么需要返回一个block;
  • 如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。
  1. 实例化并调用相关的方法
- (Person* runBlock;- (Person* studyBlock;

代码:声明

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

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

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

 - (Person* runBlock { Person*  = ^() { NSLog; return self; }; return block;} - (Person* studyBlock { Person*  = ^() { NSLog; return self; }; return block;}
  • Masonry是一个OC开发中,非常好用的自动布局的第三方框架;
  • SnapKit是Masonry团队打造的swift版本的自动布局框架;如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点“赞”!

实现:

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

最终目标

简单实现:

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

 - run; - study;

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

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

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

- run1 { NSLog; return [[Personalloc] init];}- study1{ NSLog; return[[Personalloc]init];}
-run1;-study1; 

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

make.centerY.equalTo(self.view).offset;
  1. 新建项目command shift N
  2. 创建一个Person类并为其增加两个方法

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

必威 1配图

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

代码方法的声明

- (MASConstraint* equalTo { return ^id(idattribute) { return self.equalToWithRelation(attribute,NSLayoutRelationEqual); };}
  • Posted by 微博@iOS音视频
  • 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

方法的实现

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

2.再实现最终目标

本文由必威发布于编程,转载请注明出处:必威函数式编程概念,链式编程