iOS小技能:链式编程在iOS开发中的应用
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
I 预备知识
先来了解下开发过程中常常接触的几个编程思想
1.1 面向过程
处理事情以过程为核心,一步一步的实现。
1.2 面向对象
万物皆对象
面向对象对比面向过程的优胜之处在于,名词化的概念比动词化的描述,更便于人类理解。
这也是相比函数式编程的主要优点,许多函数是难以命名的,但对象却很容易。
封装是为了更好的重用性、可扩展性,但要综合考虑性能问题,即使新增了判断也会增加性能的消耗,只是不会量级的增加。比如简单工厂和抽象工厂(反射机制)的封装,会增加性能的消耗。但把对象的管理变成了可配置化。
1.3 函数式编程
把操作尽量写成一系列嵌套的函数或者方法调用。
函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果) 代表:ReactiveCocoa
1.4 链式编程
将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好a(1).b(2).c(3)。
链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)
代表:masonry框架
objectivec
p.run() <=> [p run]();//执行方法的同时之后,立即执行方法返回的block
1.5 响应式编程
不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
代表: 1. KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现,也是 Cocoa Binding 的基础。当被观察对象的某个属性发生更改时,观察者对象会获得通知。 2. Reactive Cocoa框架 3. vuejs: http://staging-cn.vuejs.org/guide/introduction.html
II 链式编程的例子
2.1 实现链式编程的两种形式
-
声明属性,属性的类型是block,block必须有返回值(本身对象),block参数(需要操作的值)
-
`声明方法: 就是执行(getter)方法之后,得到一个block,block必须有返回值(本身对象),block参数(需要操作的值)
缺点就是 Xcode提示不太友好。不推荐`
两种实现方式本质都是一样的:
- 如果想再去调用别的对象方法,那么就需要返回一个对象;
- 如果想用()去执行,那么需要返回一个block;
- 如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象。
2.2 通过声明方法形式实现链式编程
缺点: Xcode提示不太友好(不推荐)
block 实现链式编程的例子1:(将block和method的特性 结合起来) http://github.com/zhangkn/DKUsingblockImplementChainProgramming
直接声明方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)
例子: p.run() <=> [p run]()
效果:p.run() <=> [p run]();// 执行方法的同时之后,立即执行方法返回的block。
```objectivec int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... //使用block实现链式编程 People *p= [[People alloc]init]; // p.run() <=> p run;// 执行方法的同时之后,立即执行方法返回的block。 p.run().study();
p.run().name(@"将block和method的特性 结合起来");
}
return 0;
} ```
代码的实现 ```objectivec
import "People.h"
@implementation People
-
(People *(^)())run{ return ^{ NSLog(@"run"); return self; };// 返回一个block }
-
(People *(^)())study{ return ^{ NSLog(@"study"); return self; };// 返回一个block }
-
(People (^)(NSString ))name{ return ^(NSString *name){ NSLog(@"%@",name); return self; }; }
```
2.3 通过声明属性形式实现链式编程
声明属性,属性的类型是block,block必须有返回值(本身对象),block参数(需要操作的值)
声明属性: 本质就是利用他的getter方法
完整SDK源码【封装富文本API,采用block实现链式编程】(block 的妙用:结合block和方法的优点实现iOS的链式编程)
文章:http://blog.csdn.net/z929118967/article/details/107835195
从CSDN资源下载完整SDK代码:http://download.csdn.net/download/u011018979/14038715
部分API
- 用法例子
```objectivec NSMutableAttributedString *xx = [[NSMutableAttributedString alloc]init];
xx.kn_addString(@"封装富文本API").kn_fontColor(UIColor.redColor).kn_addString(@"采用block实现链式编程").kn_fontColor(UIColor.blueColor).kn_addString(@"!");
```
以Masonry 框架为例子,进行分析
调用的equalTo:方法 返回的就是一个返回值为MASConstraint的block
objectivec
- (MASConstraint * (^)(id))equalTo { return ^id(id attribute) { return self.equalToWithRelation(attribute, NSLayoutRelationEqual); }; }
用法
```objectivec - (UIImageView *)imgForReason{
if (nil == _imgForReason) {
UIImageView *img2 = [[UIImageView alloc] init];
_imgForReason = img2;
[self addSubview:_imgForReason];
[img2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(25);
make.top.equalTo(self.imgForPassword.mas_bottom).offset(12);
make.size.mas_equalTo(CGSizeMake(kScreenWidth-100, 76));
}];
}
return _imgForReason;
} ```
see also
iOS富文本&图文混排的使用指南
1、封装富文本API,采用block实现链式编程
2、 超链接属性
3、HTML字符串与富文本互转
4、创建带有图片的富文本
————————————————
版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:http://blog.csdn.net/z929118967/article/details/114014827
公众号:iOS逆向
- iOS小技能:UITableView的适配 (iOS10/iOS14/iOS16.0)
- iOS小技能:和uni-app、unity的融合方案
- iOS小技能:iOS15崩溃排查技巧(symbolicatecrash符号化分析问题、导出和隐藏符号)
- iOS小技能:【intercept the HTTP/HTTPS requests 】利用NSURLProtocol 拦截请求
- iOS小技能: tweak 集成CocoaAsyncSocket(建连、断开、重连、心跳、通用请求)
- iOS小技能:iOS13 证件扫描 & 文字识别API
- iOS小技能:集成下拉刷新控件 & 实现无感知上拉加载更多
- iOS小技能:代码触发button的点击事件、快速找到按钮action方法
- iOS小技能:拨号、发邮件、短信、应用间跳转
- iOS小技能:链式编程在iOS开发中的应用
- iOS小技能:iOS14 读取用户剪切板数据弹出提示的兼容方案
- iOS小技能:因境外IP无法访问导致 App 被拒的解决方案
- iOS小技能:RSA签名、验签、加密、解密的原理
- iOS小技能:Xcode14新特性(适配)
- iOS小技能:Socket基础知识
- iOS小技能:SKU视图搭建
- iOS小技能: 日历的使用(案例:两个时间的比较、获取最近30天的数据)
- iOS小技能:1. iOS 实现json数据提交 2. 对同一个URL的多次请求进行数据缓存 3. 检查网络状态
- iOS小技能:使用正则表达式对聊天记录的关键词进行监控
- iOS小技能:去掉/新增导航栏黑边(iOS13适配)