简介
本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit
源码有一定的帮助。
![](http://jbcdn2.b0.upaiyun.com/2016/03/3d6392e9770dc60d5ad51613011b41a3.jpeg)
作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit;
- Masonry是一个OC开发中,非常好用的自动布局的第三方框架;
- SnapKit是Masonry团队打造的swift版本的自动布局框架;
如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点“赞”!
一个典型的Masonry的语句:
1
|
make
.
centerY
.
equalTo
(
self
.
view
)
.
offset
(
100
)
;
|
就是这个“.”让Masonry更加鲜活的展示给了开发者,在我心中
Masnory/ SnapKit函数式编程的一个经典的代表作,非常值得参考和学习!
链式编程的好处不用再说了,用过Masnory/ SnapKit的都知道;
那么问题来了,怎么写链式编程呢?
一步步来实现一个函数式编程
- 新建项目command +shift + N
- 创建一个Person类
并为其增加两个方法12- ( void ) run ;- ( void ) study ;
简单实现:123456- ( void ) run {NSLog ( @ "run" ) ;}- ( void ) study {NSLog ( @ "study" )} - 实例化并调用相关的方法
123Person* person = [ [ Personalloc ] init ] ;[ personrun ] ;[ personstudy ] ;
以上三步实现了一个非常简单的程序;最终目标
12person . runBlock ( ) . studyBlock ( ) . runBlock ( ) ;person . studyBlock ( ) . studyBlock ( ) . runBlock ( ) ;分解目标
1.先实现这种方式调用1[ [ person run1 ] study1 ] ;2.再实现最终目标
显然,如果想要实现[person run1]调用一个方法,那么run1就需要一个返回一个对象,让这个对象去调用study1。
这样分析后,就简单了,就是增加一个返回值。代码
方法的声明12- ( Person* ) run1 ;- ( Person* ) study1 ;方法的实现
12345678- ( Person* ) run1 {NSLog ( @ "run" ) ;return [ [ Personalloc ] init ] ;}- ( Person* ) study1 {NSLog ( @ "study" ) ;return [ [ Personalloc ] init ] ;}实现最终目标:
1person . runBlock ( ) . studyBlock ( ) . runBlock ( ) ;在OC中,`()`block是以
()
的形式去执行的,猜想如果返回一个block的话,那么我就可以用()
来实现runBlock()这种效果了吧!
再结合我们的分解步骤,runBlock()代表执行了一个block,如果这个block的返回值的是一个对象的话,那么调用另外一个方法;这样就可以一直链接下去吧!实现了我们想要的目标!代码:
声明12- ( Person* ( ^ ) ( ) ) runBlock ;- ( Person* ( ^ ) ( ) ) studyBlock ;实现:
1234567891011121314- ( Person* ( ^ ) ( ) ) runBlock {Person* ( ^ block ) ( ) = ^ ( ) {NSLog ( @ "run" ) ;return self ;} ;return block ;}- ( Person* ( ^ ) ( ) ) studyBlock {Person* ( ^ block ) ( ) = ^ ( ) {NSLog ( @ "study" ) ;return self ;} ;return block ;}再来看一下Masonry的一个函数式编程
1make . right . equalTo ( self . right ) . insets ( kPadding ) ;最终调用的函数:
返回的就是一个返回值为MASConstraint的block12345- ( MASConstraint* ( ^ ) ( id ) ) equalTo {return ^ id ( idattribute ) {return self . equalToWithRelation ( attribute , NSLayoutRelationEqual ) ;} ;}函数式编程总结
- 如果想再去调用别的方法,那么就需要返回一个对象;
- 如果想用()去执行,那么需要返回一个block;
- 如果想让返回的block再调用对象的方法,那么这个block就需要返回一个对象(即返回值为一个对象的block)。
响应式编程的概念
在网上流传一个非常经典的解释`响应式编程的概念`
在程序开发中:
a = b + c
赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化
响应式编程,目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化;在上篇博客中《iOS-Reactive Cocoa的常见用法》
Reactive Cocoa就是一个响应式编程的经典作品!