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
  • 相关阅读:
    BZOJ2821 作诗(Poetize) 【分块】
    BZOJ2724 蒲公英 【分块】
    Codeforces 17E Palisection 【Manacher】
    BZOJ2565 最长双回文串 【Manacher】
    Codeforces 25E Test 【Hash】
    CODEVS3013 单词背诵 【Hash】【MAP】
    HDU2825 Wireless Password 【AC自动机】【状压DP】
    HDU2896 病毒侵袭 【AC自动机】
    HDU3065 病毒侵袭持续中【AC自动机】
    HDU2222 Keywords Search 【AC自动机】
  • 原文地址:https://www.cnblogs.com/panda1024/p/6031684.html
Copyright © 2011-2022 走看看