您的位置:首页 > 移动开发 > IOS开发

iOS 利用Block实现链式编程

2015-02-10 18:46 363 查看

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;

    };

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: