起因

某日使用DKChainableAnimationKit的时候发现可以如下写代码:

view.animation.rotate(180).anchorTopLeft.thenAfter(1.0).rotate(90).anchorCenter.animanimation

无独有偶。Masonry其实也是这样用的

make.right.equalTo(self.view).with.offset(-10);

原理

看了一下代码,其实就是通过一个实现了所有方法的Chaining Method Object,每一个方法都返回一个`Block
, 这个Block返回类型为Chaining Method ObjectBlock`的参数为你想要传入的参数类型。

@interface ChainingMethodObject : NSObject
- (ChainingMethodObject * (^)(void))doA;
- (ChainingMethodObject * (^)(NSInteger i))doB;
- (ChainingMethodObject * (^)(NSString* str))doC;
- (ChainingMethodObject * (^)(NSString* str, NSArray* array))doD;
@end@implementation ChainingMethodObject
- (ChainingMethodObject * (^)(NSInteger i))doB{return ^id(NSInteger i) {//do actual stuff related with Breturn self;};
}
...其他方法类似
@end

通常情况下,ChainingMethodObject都会有delegate存在,具体视实际运用情况而定,如动画库DKChainableAnimationKit中,animation里有个weak var view:UIView指向UIView从而对target View进行操作。

@implementation ChainingMethodObject
- (id) initWithObject:(id)obj{self = [super init];_delegate = obj;return self;
}
@end
@interface HostObject()
ChainingMethodObject * _cObj;
@end
@implementation HostObject (ChainingMethodObject)
- (ChainingMethodObject *) getChainingMethodObject{if (!_cObj)_cObj = [[ChainingMethodObject alloc] initWithObject:self];return _cObj;
}
@end

然后就可以了:

HostObject* hostObject = [HostObject new];
[hostOjbect getChainingMethodObject].doA.doC(@"Hi there!").doD(@"Hello",@[@1,@2]).doB(100).doA;

参考

DKChainableAnimationKit

Masonry

原作写于segmentfault 链接

Objective C 链式调用 1相关推荐

  1. Objective C 链式调用

    起因 某日使用DKChainableAnimationKit的时候发现可以如下写代码: view.animation.rotate(180).anchorTopLeft.thenAfter(1.0). ...

  2. javascript --- 对象的方式体验链式调用

    将功能相近的方法写入同一个对象中,是一个很好的编程习惯,便于后期的维护和前期的开发. foo1 var fooObj = {foo1: function() {console.log('foo1'); ...

  3. java中链式调用_Java及Android中常用链式调用写法简单示例

    本文实例讲述了Java及Android中常用链式调用写法.分享给大家供大家参考,具体如下: 最近发现,目前大火的许多开源框架中,大多都使用了一种"(方法).(方法).(方法)"的形 ...

  4. jq的链式调用.end();

    jq的链式调用.end(); 先上code <!DOCTYPE html> <html lang="en"> <head><meta ch ...

  5. [jQuery] jQuery是如何链式调用的?

    [jQuery] jQuery是如何链式调用的? 返回对象本身即可,类似 obj = { func: function(){ return obj } }, 那么 obj.func().func() ...

  6. java链式调用空指针_java 链式调用

    前言 现在很多开源库或者代码都会使用链式调用.因为链式调用在很多时候,都可以使我们的代码更加简洁易懂.以下Student类有多数个属性,让我们看看非链式调用和链式调用有何区别. 非链式调用 Main类 ...

  7. 实现同步请求_图解 Promise 实现原理(二)—— Promise 链式调用

    摘要 很多同学在学习 Promise 时,知其然却不知其所以然,对其中的用法理解不了.本系列文章由浅入深逐步实现 Promise,并结合流程图.实例以及动画进行演示,达到深刻理解 Promise 用法 ...

  8. Lombok链式调用,子类对象set父类属性,返回父类对象

    前言 lombok相信大家都用过,没用过肯定也不会点进来,一直用着都很舒服.今但是天在码代码时,碰到了一个问题,卡了半天.问题是这样的:Lombok链式调用父类中的set属性时,返回的居然是一个父类对 ...

  9. 彻底掌握 Promise-原生Promise的实现(二) Promise的链式调用

    在 彻底掌握 Promise- 原生 Promise 的实现(一) 已经初步实现了 promise 的简易版本,这距离实现完整版本的 Promise 还有一段距离,下面我们将在简易版本的基础上增加 P ...

最新文章

  1. ASP中Randomize随机函数的使用
  2. BZOJ2132 圈地计划
  3. 经验传承:谈色彩设计方法
  4. python对文件夹内文件去重
  5. sap 常用事务代码
  6. SAP Spartacus 在 Github 托管虚拟机上执行的 pipeline 明细
  7. Ubuntu apt update(apt-get update)报错、失败
  8. Capital Asset Pricing Model (CAPM)
  9. java 如何执行dig 命令_如何在cmd下直接执行Dig命令
  10. 蓝桥 字符串跳步 JAVA
  11. android service录音,android录音并上传至服务器
  12. Mybatis 官网地址
  13. MBO目标管理与SMART原则
  14. C语言函数大全-- o 开头的函数
  15. 帝国cms e loop php,帝国cms灵动标签e:loop实例学习
  16. Word排版小技巧 | 快速论文排版
  17. 【从零开始玩量化9】jqktrader:同花顺客户端自动化交易
  18. 用x264和ffmpeg将YUV编码为.h264(1)
  19. 程序员欢乐送(第38期)
  20. 2036 改革春风吹满地(杭电)

热门文章

  1. windows7访问03文件服务器慢
  2. confluence 常见问题处理
  3. 简单的5*5,五子棋小游戏
  4. [C#]统计文本文件txt中的行数(快速读取)
  5. Bzoj3168 [Heoi2013]钙铁锌硒维生素
  6. 成都Uber优步司机奖励政策(2月1日)
  7. HDU -- 2084 数塔(简单DP)
  8. 网络上一个人也是孤独地.
  9. MMA冠军Rory MacDonald:比特币现金(BCH)是真正的比特币
  10. redis数据库和python的交互