iOS:用Block写一个链式编程
一、介绍
链式编程是一个比较新颖的编程方式,简单直观,用起来也比较舒服。目前比较有名的Mansory和BabyBlueTooth就是使用链式编程写的第三方框架。
二、写法
链式编程写法不同于传统方式,初次写起来比较别扭,但是一旦习惯了,用起来比较得心应手。那么,如何写呢?其实就是一个对象调用它的实例方法后返回一个block(已经定义过),而这个block内部又返回该对象。依此类推,该对象不论调用多少个它的实例方法,最终都会返回该对象本身。
三、实例
LearnManager类定义和实现
// // LearnManager.h // ChainProgramming // // Created by 夏远全 on 2017/9/30. // Copyright © 2017年 夏远全. All rights reserved. #import <Foundation/Foundation.h> /** 定义block,返回值类型是LearnManager对象 */ @class LearnManager; typedef LearnManager *(^LearnChineseBlock)(NSString *chineseName); typedef LearnManager *(^LearnEnglishBlock)(NSString *englishName); typedef LearnManager *(^LearnFranchBlock) (NSString *franchName); @interface LearnManager : NSObject /** 定义对象方法 @return 返回值是定义过的block */ -(LearnChineseBlock)learnChinese; -(LearnEnglishBlock)learnEnglish; -(LearnFranchBlock)learnFranch; @end
// // LearnManager.m // ChainProgramming // Created by 夏远全 on 2017/9/30. // Copyright © 2017年 夏远全. All rights reserved. #import "LearnManager.h" @implementation LearnManager -(LearnChineseBlock)learnChinese{ //外部返回一个block return ^LearnManager *(NSString *chineseName){ NSLog(@"%@", [NSString stringWithFormat:@"学习%@!",chineseName]); //内部block返回一个LearnManager对象 return self; }; } -(LearnEnglishBlock)learnEnglish{ //外部返回一个block return ^LearnManager *(NSString *englishName){ NSLog(@"%@", [NSString stringWithFormat:@"学习%@!",englishName]); //内部block返回一个LearnManager对象 return self; }; } -(LearnFranchBlock)learnFranch{ //外部返回一个block return ^LearnManager *(NSString *franchName){ NSLog(@"%@", [NSString stringWithFormat:@"学习%@!",franchName]); //内部block返回一个LearnManager对象 return self; }; } @end
ViewController类导入并调用
// // ViewController.m // ChainProgramming // // Created by 夏远全 on 2017/9/30. // Copyright © 2017年 夏远全. All rights reserved. // #import "ViewController.h" #import "LearnManager.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; LearnManager *learn = [[LearnManager alloc] init];
//learn对象首先调用方法返回一个block,然后给block传入字符串参数并调用,于是又返回了该对象learn本身 learn.learnChinese(@"语文").learnEnglish(@"英语").learnFranch(@"法语"); } @end
四、打印
2017-09-30 18:41:10.288 ChainProgramming[92884:3768713] 学习语文! 2017-09-30 18:41:10.288 ChainProgramming[92884:3768713] 学习英语! 2017-09-30 18:41:10.289 ChainProgramming[92884:3768713] 学习法语!
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!