• iOS 利用Block实现链式编程


    1. 传统编程

    // Person的方法

    - (void)eat

    {

        NSLog(@"吃饭");

    }

     - (void)learn

    {

        NSLog(@"学习");

    }

    - (void)play

    {

        NSLog(@"娱乐");

    }

    // 连续做事情

    Person *p = [ [Person alloc] init ];

    [p eat];

    [p learn];

    [p play];

    2. 不用Block,实现链式编程

    // Person的方法

    - (Person *)eat

    {

        NSLog(@"吃饭");

       return self;

    }

     - (Person *)learn

    {

        NSLog(@"学习");

        return self;

    }

    - (Person *)play

    {

        NSLog(@"娱乐");

        return self;

    }

    // 连续做事情,这么写看得眼花 

    Person *p = [ [Person alloc] init ];

    [[[p eat] learn] play];

    3. 利用Block实现链式编程

    // Person的方法

    - ( Person *(^)() )eat

    {

      return ^{

            NSLog(@"吃饭");

          return self;

      };

    }

    - ( Person *(^)() )learn

    {

      return ^{

            NSLog(@"学习");

          return self;

      };

    }

    - ( Person *(^)() )play

    {

      return ^{

            NSLog(@"娱乐");

          return self;

      };

    }

    // 连续做事情

    Person *p = [ [Person alloc] init ];

    p.eat().learn().play();

    4. 带参数的链式编程

    比如人的吃饭方法,参数是 NSString *food

    - ( Person *(^)() )eat:(NSString*) food

    {

      return ^(food){

            NSLog(@"吃饭);

          return self;

      };

    }

    如果是上面这种写法:p.eat后面不能跟 :food, 因为p.eat本身就等同于[ p eat:(NSString *)food ],如果写p.eat:food ,相当于 [p eat::food],这样是不对的.

    所以正确的写法:

    - ( Person *(^)( NSString* food ) )eat

    {

      return ^( NSString* food ){

            NSLog(@"吃饭---- %@",food);

          return self;

      };

    }

    // 连续做事情

    p.eat(@"白菜").learn().play();

    5. 总结,用Block实现链式编程无非就是:方法的返回值是一个Block,Block内部装着真正要执行的方法,Block内部再返回self;

         如果有参数,通过Block的参数往里传.

    - ( 返回值是Block ) 方法名

    {

        return *{

          Block内部装着真正要执行的代码

          return self;

        };

    }

  • 相关阅读:
    P3619 魔法
    【HAOI2014】遥感监测
    cdcq的独立博客上线辣!-> http://cdcq.coding.me/blog/
    重复型图床
    【BZOJ1213】高精度开根
    前后端技术
    【HAOI2011】problem b
    【HAOI2011】problem a
    【BZOJ4553】【TJOI2016】【HEOI2016】序列
    【HAOI2015】 T1
  • 原文地址:https://www.cnblogs.com/oumygade/p/4284707.html
Copyright © 2020-2023  润新知