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] 学习法语!
时间: 2024-10-13 16:51:11

iOS:用Block写一个链式编程的相关文章

iOS端JSON转Model链式编程框架SuperKVC使用方法与原理

背景 在client编程中.字典转模型是一个极为常见的问题,苹果提供了KVC来实现NSDictionary到Model的注入,可是KVC仅仅能进行单层浅注入.且无法处理类型转换.key与属性名不正确应.深度注入等问题,笔者从Masonry得到启示,开发了一个通过链式配置注入器实现深度注入.类型转换.key-属性名映射等功能的轻量级注入框架SuperKVC.眼下已经开源到GitHub,点击这里前往.欢迎Star和Fork.欢迎和我一起完好这个框架! 本文将从应用和原理两个角度介绍SuperKVC

iOS开发技巧系列---使用链式编程和Block来实现UIAlertView

UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本文也并不提倡开发者再使用UIAlertView,本文的目的是探讨如何将原来的给变量赋值和通过Delete来回调的方式变成链式编程风格和通过Block来回调.通过学习对UIAlertView的改造让各位iOS开发者能够学会这种更加便捷的开发方式 什么是链式编程 对于有一定开发经验的开发者来说,链式编程

ASP.NET MVC学前篇之扩展方法、链式编程

前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的是外围的知识,有的是包含在框架内的. MVC学前篇字样?有噱头的成分也有真实的成分,所以工欲善其事,必先利其器.器是什么?基础嘛,虽然说MVC框架中涉及到的知识很多很多也不是我一篇两篇能说完的,我能做的就是知道多少就跟大家分享多少,当然了随着时间的推移会完善这个系列. 1扩展方法 扩展方法是C# 3.0特性里的知识,它用在最多的地方是在Linq中,

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的方法 - (P

(一一八)利用block实现链式编程

有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up.down.left.right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写: [ball right]; [ball down]; 如果能够按照下面这样写,会更加方便. [[ball right] down]; 要实现这样的功能十分简单,只要每个方法都返回self即可,但是如果调用次数多,会有很多个中括号.如果能改造成后面这样,会更好. ball.right().down

第四十一篇、Masonry利用Block实现链式编程

一直都觉得使用Masonry的时候语法特别优雅,很早的时候就想尝试下怎么实现, 一直都没弄明白,直到最近看见一篇叫block实现链式编程的 使用实例: UIButton * btn = [UIButton button].normalTitle(@"普通状态").normalImage([UIImage imageNamed:@"icon_help"]).selectedTitle(@"选中状态"); /// 声明文件 @interface UI

ReactiveCocoa链式编程初探

在使用 masonry 框架实现自动布局时,在程序里为一个布局穿插着6行左右这样的代码 [View mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(anotherView); make.left.equalTo(anotherView); make.width.mas_equalTo(@60); make.height.mas_equalTo(@60); }]; 一直觉得不够漂亮,希望有个一行代码设置约束的框架

Objective-C 链式编程思想

链式编程思想 链式编程是什么 链式编程就是将调用多个方法用点语法连接起来,让代码更加简洁和可读性更高刚开始接触链式编程是Masonry,用起来真的非常爽 1 make.left.right.top.equalTo(self.view); 这样一句语句就调用了4个方法.left调用了left属性的get方法.right, .top调用了right和top方法.equalTo()调用了equalTo方法 这种写法极大简化了写约束的方式 原理 原理就是调用的属性的类型或者方法的返回类型为原调用属性的类

链式编程思想

接下来的部分摘自:最快让你上手之ReactiveCocoa基础篇 先简单介绍下目前咱们已知的编程思想. 1 面向过程:处理事情以过程为核心,一步一步的实现. 2 面向对象:万物皆对象 3 链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.a(1).b(2).c(3) 链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值) 代表:Masonry框架. 4 响应式编程思想:不需要考虑调用顺序,只需要知道考虑