zoukankan      html  css  js  c++  java
  • 链式编程和函数式编程

    说起链式编程和函数式编程,小伙伴们千万不要紧张。

    听着很高大尚,其实也就那么回事。相信有过C#开发经验的,或者其他编程经验的,只要不是OC,一看就知道。

    看两行代码:

    1     Person *person = [[Person alloc] init];
    2     person.run(9.2).eat(@"香蕉").run(1.2).eat(@"面条");

    上面的就是链式编程+函数式编程。

    来个大白话解释:看到括号里面的参数了吧,跟C的函数调用是不是很相似,包括别的语言,都用小括号传参,只有OC是冒号传参。

    再看方法调用用的是".",而OC用的是[]+空格。

    这几个方法调用,如果要按OC的打法,估计要整4行,对象一个一个的调用方法,但链式就是这么一行搞定。

    我们来分析一下,在OC中,什么可以通过小括号()来传参呢,没错,那就是Block,调用Block的时候,blockName(para),就是这样。

    所以,我们推断run(para)和eat(para)这两个方法,肯定返回值是一个Block,而且是带一个参数的Block。

    那么通过 《点》 调用方法怎么解释呢? 点其实就是调用getter方法,所以run和eat方法没有参数,只有一个返回类型为Block的值。

    而且,能一直点下去,说明什么呢,说明Block也有返回值啊,而且返回值的类型就是当前对象的类型。

    哈哈,这下明白了吧。

    原理说明白了,我们上代码吧:

    Person类头文件:

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Person : NSObject
     4 
     5 // 函数的返回值是一个Block,Block的返回值是当前对象,Block有一个参数
     6 - (Person *(^)(double distance))run;
     7 
     8 // 函数的返回值是一个Block,Block的返回值是当前对象,Block有一个参数
     9 - (Person *(^)(NSString *food))eat;
    10 
    11 @end

    Person类的.m文件:

     1 #import "Person.h"
     2 
     3 @implementation Person
     4 
     5 - (Person *(^)(double))run{
     6     // 方法的返回是一个”有参无返回值的Block“
     7     return ^(double distance){
     8         NSLog(@"跑:%f",distance);
     9         // block的返回值是当前对象
    10         return self;
    11     };
    12 }
    13 
    14 - (Person *(^)(NSString *))eat{
    15     // 方法的返回是一个”有参无返回值的Block“
    16     return ^(NSString *food){
    17         NSLog(@"吃:%@",food);
    18         // block的返回值是当前对象
    19         return self;
    20     };
    21 }
    22 
    23 @end

    看到了吧,一定要看这2行注释,这可是整个的核心。

    接下来,调用即可。

     1 #import "ViewController.h"
     2 #import "Person.h"
     3 
     4 @interface ViewController ()
     5 
     6 @end
     7 
     8 @implementation ViewController
     9 
    10 - (void)viewDidLoad {
    11     [super viewDidLoad];
    12     
    13     Person *person = [[Person alloc] init];
    14     
    15     // 这就是链式编程+函数式编程
    16     person.run(9.2).eat(@"香蕉").run(1.2).eat(@"面条");
    17 }
    18 
    19 @end
  • 相关阅读:
    BZOJ 3236 AHOI 2013 作业 莫队算法
    使用再哈希算法查找元素
    冰雪奇缘--用爱酿就一部经典
    Scrapy系列教程(2)------Item(结构化数据存储结构)
    html学习笔记二
    知方可补不足~sqlserver中触发器的使用
    我心中的核心组件(可插拔的AOP)~调度组件quartz.net
    EF架构~为BulkInsert引入SET IDENTITY_INSERT ON功能
    知方可补不足~sqlserver中使用sp_who查看sql的进程
    知方可补不足~为千万级数据表加索引
  • 原文地址:https://www.cnblogs.com/panda1024/p/6031684.html
Copyright © 2011-2022 走看看