Objective C 链式调用 1
起因
某日使用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 Object,
Block`的参数为你想要传入的参数类型。
@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相关推荐
- Objective C 链式调用
起因 某日使用DKChainableAnimationKit的时候发现可以如下写代码: view.animation.rotate(180).anchorTopLeft.thenAfter(1.0). ...
- javascript --- 对象的方式体验链式调用
将功能相近的方法写入同一个对象中,是一个很好的编程习惯,便于后期的维护和前期的开发. foo1 var fooObj = {foo1: function() {console.log('foo1'); ...
- java中链式调用_Java及Android中常用链式调用写法简单示例
本文实例讲述了Java及Android中常用链式调用写法.分享给大家供大家参考,具体如下: 最近发现,目前大火的许多开源框架中,大多都使用了一种"(方法).(方法).(方法)"的形 ...
- jq的链式调用.end();
jq的链式调用.end(); 先上code <!DOCTYPE html> <html lang="en"> <head><meta ch ...
- [jQuery] jQuery是如何链式调用的?
[jQuery] jQuery是如何链式调用的? 返回对象本身即可,类似 obj = { func: function(){ return obj } }, 那么 obj.func().func() ...
- java链式调用空指针_java 链式调用
前言 现在很多开源库或者代码都会使用链式调用.因为链式调用在很多时候,都可以使我们的代码更加简洁易懂.以下Student类有多数个属性,让我们看看非链式调用和链式调用有何区别. 非链式调用 Main类 ...
- 实现同步请求_图解 Promise 实现原理(二)—— Promise 链式调用
摘要 很多同学在学习 Promise 时,知其然却不知其所以然,对其中的用法理解不了.本系列文章由浅入深逐步实现 Promise,并结合流程图.实例以及动画进行演示,达到深刻理解 Promise 用法 ...
- Lombok链式调用,子类对象set父类属性,返回父类对象
前言 lombok相信大家都用过,没用过肯定也不会点进来,一直用着都很舒服.今但是天在码代码时,碰到了一个问题,卡了半天.问题是这样的:Lombok链式调用父类中的set属性时,返回的居然是一个父类对 ...
- 彻底掌握 Promise-原生Promise的实现(二) Promise的链式调用
在 彻底掌握 Promise- 原生 Promise 的实现(一) 已经初步实现了 promise 的简易版本,这距离实现完整版本的 Promise 还有一段距离,下面我们将在简易版本的基础上增加 P ...
最新文章
- ASP中Randomize随机函数的使用
- BZOJ2132 圈地计划
- 经验传承:谈色彩设计方法
- python对文件夹内文件去重
- sap 常用事务代码
- SAP Spartacus 在 Github 托管虚拟机上执行的 pipeline 明细
- Ubuntu apt update(apt-get update)报错、失败
- Capital Asset Pricing Model (CAPM)
- java 如何执行dig 命令_如何在cmd下直接执行Dig命令
- 蓝桥 字符串跳步 JAVA
- android service录音,android录音并上传至服务器
- Mybatis 官网地址
- MBO目标管理与SMART原则
- C语言函数大全-- o 开头的函数
- 帝国cms e loop php,帝国cms灵动标签e:loop实例学习
- Word排版小技巧 | 快速论文排版
- 【从零开始玩量化9】jqktrader:同花顺客户端自动化交易
- 用x264和ffmpeg将YUV编码为.h264(1)
- 程序员欢乐送(第38期)
- 2036 改革春风吹满地(杭电)