有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up、down、left、right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写:

[ball right];
[ball down];

如果能够按照下面这样写,会更加方便。

[[ball right] down];

要实现这样的功能十分简单,只要每个方法都返回self即可,但是如果调用次数多,会有很多个中括号。如果能改造成后面这样,会更好。

ball.right().down();

要实现这么调用方法,可以用结构体,让方法返回一个结构体,这时候加上(),相当于执行一个结构体,例如有个结构体名称为block1,无参数,调用方法为block1(),因此我们写ball.right()相当于拿到了返回的block进行执行。需要注意的是,为了能够通过点语法执行方法,方法不能有参数,否则只能用中括号,参数要传递,通过block即可。

下面的代码实现了四个无参方法和一个有参方法:

#import <Foundation/Foundation.h>

@interface Ball : NSObject

- (Ball *(^)())up;
- (Ball *(^)())down;
- (Ball *(^)())right;
- (Ball *(^)())left;
- (Ball *(^)(NSString *sth))doSomething; @end
#import "Ball.h"

@implementation Ball

- (Ball *(^)())up{

    return ^{
NSLog(@"up");
return self;
}; } - (Ball *(^)())down{ return ^{
NSLog(@"down");
return self;
}; } - (Ball *(^)())right{ return ^{
NSLog(@"left");
return self;
};
} - (Ball *(^)())left{ return ^{
NSLog(@"right");
return self;
}; } - (Ball *(^)(NSString *))doSomething{ return ^(NSString *sth){
NSLog(@"do <%@>",sth);
return self;
}; } @end

注意结构体的写法即可,每个方法内部直接返回结构体,需要做的事情直接在结构体内完成。

测试这个类的链式调用:

#import <Foundation/Foundation.h>
#import "Ball.h" int main(int argc, const char * argv[]) {
@autoreleasepool { Ball *b = [[Ball alloc] init];
b.up().down().right().doSomething(@"rotate").left(); // 方法不能有参数,否则只能用中括号调用方法。
// 参数通过block接收
// b.up返回了block,()表示调用block,从这里可以传入参数 }
return 0;
}

打印出的数据:

2015-08-11 22:16:23.777 链式编程[14240:145326] up
2015-08-11 22:16:23.778 链式编程[14240:145326] down
2015-08-11 22:16:23.778 链式编程[14240:145326] left
2015-08-11 22:16:23.779 链式编程[14240:145326] do <rotate>
2015-08-11 22:16:23.779 链式编程[14240:145326] right

(一一八)利用block实现链式编程的更多相关文章

  1. iOS利用block实现链式编程方法(Objective-C链式编程)

    objc利用block实现链式编程方法 因为不好读.block和其他语言的匿名函数一样,很多程序员刚开始很难主动去用他. 本文描述block作为属性的实际使用,看懂block,并讲解如何利用block ...

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

    一直都觉得使用Masonry的时候语法特别优雅,很早的时候就想尝试下怎么实现, 一直都没弄明白,直到最近看见一篇叫block实现链式编程的 1.方法的返回类型是代码块 >代码块的返回类型是该类的 ...

  3. AJ学IOS 之BLOCK的妙用_利用block实现链式编程

    AJ分享,必须精品 一:场景 我们有个对象人,他有两个方法,一个是学习study,一个是跑步run, 这个人有个怪癖,跑完步之后必须学习,为了实现这个方法并且能调用方便,我们让跑步和学习都回返回自己这 ...

  4. [Objective-C]用Block实现链式编程

    看这篇博客时最快让你上手ReactiveCocoa之基础篇看到作者介绍链式编程那一块,发现自己的钻研精神不足.想想自己使用链式编程也有段时间了,对,就是 Masonry 库.自己一直享受点语法带来的效 ...

  5. 新浪微博客户端(63)-使用block进行链式编程

    Person.h #import <Foundation/Foundation.h> @interface Person : NSObject - (Person *(^)())study ...

  6. ios的链式编程笔记

    1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数  > 链式编程思想 2. 使用block当函数的返回参数 // 之前开发中比较习惯 ...

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

    UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...

  8. iOS:用Block写一个链式编程

    一.介绍 链式编程是一个比较新颖的编程方式,简单直观,用起来也比较舒服.目前比较有名的Mansory和BabyBlueTooth就是使用链式编程写的第三方框架. 二.写法 链式编程写法不同于传统方式, ...

  9. (数据科学学习手札107)在Python中利用funct实现链式风格编程

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 链式编程是一种非常高效的组织代码的方式,典型如p ...

随机推荐

  1. github常用命令

    全局配置 git config --global user.name "lewiscutey"git config --global user.email "lewisc ...

  2. bzip2

    压缩和解压缩文件bzip2 options] [file-list] bunzip2 [options] [file-list] bzcat [options] [file-list] bzip2re ...

  3. js 删除字符串中所有空格

    //去除头尾和中间空格,制表符 function trimSpaces(Str){               var ResultStr = "";               ...

  4. Java高新技术第一篇:类加载器详解

    首先来了解一下字节码和class文件的区别: 我们知道,新建一个Java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程的 ...

  5. ACM Bee

    In Africa there is a very special species of bee. Every year, the female bees of such species give b ...

  6. MySQL UPDATE 查询

    MySQL UPDATE 查询 如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用SQL语 ...

  7. python OptParse模块的用法详解

    OptParse模块的简单介绍 Python 有两个内建的模块用于处理命令行参数: 一个是 getopt只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成 ...

  8. Bootstrap3 排版-缩略语

    当鼠标悬停在缩写和缩写词上时就会显示完整内容,Bootstrap 实现了对 HTML 的 <abbr> 元素的增强样式.缩略语元素带有 title 属性,外观表现为带有较浅的虚线框,鼠标移 ...

  9. 20160208.CCPP体系详解(0018天)

    程序片段(01):main.c 内容概要:PointWithOutInit #include <stdio.h> #include <stdlib.h> //01.野指针详解: ...

  10. ECharts, PHP, MySQL, Ajax, JQuery 实现前后端数据可视化

    ECharts 下载js代码 工作原理浅析 在项目中引入ECharts 后台处理 数据库端MySQL PHP端 JQuery Ajax处理 ECharts 端处理 前端全部代码 演示结果 总结 最近要 ...