iOS函数式编程初探
来源:互联网 发布:linux驱动加锁的情况 编辑:程序博客网 时间:2024/06/04 20:02
本篇文章主要回顾一下——iOS函数式编程,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助。
作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit;
- Masonry是一个OC开发中,非常好用的自动布局的第三方框架;
- SnapKit是Masonry团队打造的Swift版本的自动布局框架;
如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点“赞”!
一个典型的Masonry的语句:
make.centerY.equalTo(self.view).offset(100);
就是这个“.”让Masonry更加鲜活的展示给了开发者,在我心中Masnory/SnapKit函数式编程的一个经典的代表作,非常值得参考和学习!
链式编程的好处不用再说了,用过Masnory/ SnapKit的都知道;
那么问题来了,怎么写链式编程呢?
一步步来实现一个函数式编程
- 新建项目command +shift + N
- 创建一个Person类,并为其增加两个方法:
- (void)run; - (void)study;
简单实现:
- (void)run{ NSLog(@"run"); } - (void)study { NSLog(@"study") }
实例化并调用相关的方法:
Person*person = [[Personalloc]init]; [personrun]; [personstudy];
以上三步实现了一个非常简单的程序。
最终目标:
person.runBlock().studyBlock().runBlock(); person.studyBlock().studyBlock().runBlock();
分解目标:
1.先实现这种方式调用:
[[person run1] study1];
2.再实现最终目标:
显然,如果想要实现[person run1]调用一个方法,那么run1就需要一个返回一个对象,让这个对象去调用study1。
这样分析后,就简单了,就是增加一个返回值。
代码:
//方法的声明-(Person*)run1;-(Person*)study1;//方法的实现- (Person*)run1 { NSLog(@"run"); return [[Personalloc] init];}- (Person*)study1{ NSLog(@"study"); return[[Personalloc]init];}
实现最终目标:
person.runBlock().studyBlock().runBlock();
在OC中,`()`block是以()的形式去执行的,猜想如果返回一个block的话,那么我就可以用()来实现runBlock()这种效果了吧!
再结合我们的分解步骤,runBlock()代表执行了一个block,如果这个block的返回值的是一个对象的话,那么调用另外一个方法;这样就可以一直链接下去吧!实现了我们想要的目标!
代码:
//声明- (Person* (^)())runBlock;- (Person* (^)())studyBlock;//实现 - (Person* (^)())runBlock { Person* (^block)() = ^() { NSLog(@"run"); return self; }; return block;} - (Person* (^)())studyBlock { Person* (^block)() = ^() { NSLog(@"study"); return self; }; return block;}
再来看一下Masonry的一个函数式编程:
make.right.equalTo(self.right).insets(kPadding);
最终调用的函数:
返回的就是一个返回值为MASConstraint的block
- (MASConstraint* (^)(id))equalTo { return ^id(idattribute) { return self.equalToWithRelation(attribute,NSLayoutRelationEqual); };}
函数式编程总结
- 如果想再去调用别的方法,那么就需要返回一个对象;
- 如果想用()去执行,那么需要返回一个block;
- 如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。
0 0
- iOS函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- .函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 函数式编程初探
- 十六进制转八进制
- 2个文件内容的比较
- Spring MVC Controller线程安全性问题
- 编辑文章 - 博客频道 - CSDN.NET
- LeetCode OJ-78.Subsets
- iOS函数式编程初探
- 你真的清楚同步与异步、阻塞与非阻塞的区别吗?
- 编号:1001 题目:【2017.1.17】小X的逆袭
- Android adb no permissions
- 2017年用什么语言写项目
- 最近不忙,想要学习一下python
- IT技术相关学习网站推荐
- POJ2253 Frogger(最短路变形,floyd,Dijkstra,spfa)
- 简单的图像拼接实现