zoukankan      html  css  js  c++  java
  • 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] 学习法语!
  • 相关阅读:
    关于js计算非等宽字体宽度的方法
    [NodeJs系列]聊一聊BOM
    Vue.js路由管理器 Vue Router
    vue 实践技巧合集
    微任务、宏任务与Event-Loop
    事件循环(EventLoop)的学习总结
    Cookie、Session和LocalStorage
    MySQL 树形结构 根据指定节点 获取其所在全路径节点序列
    MySQL 树形结构 根据指定节点 获取其所有父节点序列
    MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/7615925.html
Copyright © 2011-2022 走看看