网站首页 > 基础教程 正文
一,什么是链式调用?
在网络前端编程里使用JQuery,经常可以看到链式调用,代码易读简洁。
例如:$(“#Test”).css(‘color’,’red’).show(200).removeClass(‘style’); 对id选择器为Test的对象进行了三项操作:先设置其字体颜色为红色,再显示对象,最后移除对象的“style”样式。
通过“.”操作符调用方法执行后返回方法执行的实体,然后可以接着再使用“.”操作符继续调用其它方法。
二,Objective-C里面如何实现链式操作?
非常简单,Objective-C语言里面,跟JQuery里面一样,可以使用Block实现链式调用。
摘抄一个网络上提供的实现例子说明:
1,首先定义一个Person对象,然后定义名为eat、learn、play的几个块为成员变量,声明为property属性
@property?(nonatomic,?readonly)?(Person*(^))eat; @property?(nonatomic,?readonly)?(Person*(^))learn; @property?(nonatomic,?readonly)?(Person*(^))play;
2,property属性会默认生成setter和getter方法,我们这里覆写getter方法,传出一个Block,Block调用返回调用者本身。
//?Person覆写的方法 -?(?Person?*(^)?)eat { return?^{ NSLog(@"吃饭"); return?self; }; } -?(?Person?*(^)?)learn { return?^{ NSLog(@"学习"); return?self; }; } -?(?Person?*(^)?)play { return?^{ NSLog(@"娱乐"); return?self; }; } //?带参数的链式调用 -?(?Person?*(^)(?NSString*?food?)?)eat { return?^(?NSString*?food?){ NSLog(@"吃饭----?%@",food); return?self; }; }
链式调用实例:
Person *p = [ [Person alloc] init ];
无参数情况:
p.eat.learn.play;
输出:
吃饭
学习
娱乐
有参数情况:
p.eat(@”意大利面”).learn.play;
输出:
吃饭—-意大利面
三,有实战意义吗?如何使用?
哇哇,看起来是个不错的小窍门啊,但是有实战意义吗?能引入什么方便吗?
好吧,之前写过两个SpriteKit的教程,做相关游戏,里面都有提到动画相关的东东。如果我要指挥一个SpriteNode实体,必须指定相关的SKAction然后让该SpriteNode节点,执行SKAction。如果是一个动作还好,但是如果要执行一系列动作,或者同时运行很多动作的话,就要生成很多SKAction,然后把它们组合在一起成为一个sequence或者group的action一起执行。
具体来举例,向右移动100,向上移动100,向左移动50,向上移动100的动画,需要如下实现:
SKAction?*move?=?[SKAction?moveBy:CGVectorMake(100,?0)?duration:1]; SKAction?*move2?=[SKAction?moveBy:CGVectorMake(0,?100)?duration:1]; SKAction?*move3?=?[SKAction?moveBy:CGVectorMake(-50,?0)?duration:1]; SKAction?*move4?=?[SKAction?moveBy:CGVectorMake(0,?100)?duration:1]; SKAction?*seq?=?[SKAction?sequence:@[move,move2,move3,move4]]; [SpriteNode?runAction:seq];
我自己封装了一个WJSAction的类,可以实现SKAction的链式调用,Github工程地址为https://github.com/halinuya/WJSAction.git,完成上面的调用,仅用如下一行就可以实现。
[SpriteNode?runAction:[WJSACTION.SeqStart().moveByV(CGVX(100),1).moveByV(CGVY(100),1).moveByV(CGVX(-50),1).moveByV(CGVY(100),1).SeqEnd()]];
看起来比较简单简洁,不需要很多中间变量。
大家可以到我封装的WJSAction工程里面直接使用链式SKAction,简化代码。
猜你喜欢
- 2024-12-19 管理系统-UniApp开发相关技巧及注意点
- 2024-12-19 前端图片延迟加载详细讲解 梦见擦窗户框
- 2024-12-19 如何使用 JavaScript 导入和导出 Excel XLSX
- 2024-12-19 XMLHttpRequest VS. Fetch, 谁才是 2019 最适合的 AJAX 技术?
- 2024-12-19 学习下ECharts 异步加载数据 echarts按需加载
- 2024-12-19 web前端框架Vue基础一 前端开发vue框架
- 2024-12-19 @HR,常见 IT 招聘术语大全(建议收藏)
- 2024-12-19 百度工程师教你玩转设计模式(单例模式)
- 2024-12-19 Cesium 两种方式加载 Geoserver服务 WMTS以及WMS、WFS、KML资源图层
- 2024-12-19 Shiny Web开发从入门到放弃 web开发视频教程
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)