本文為投稿文章,作者:Yangcs(@O_oYangsc)
簡介
本篇主要回顧一下--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的都知道;
那麼問題來了,怎麼寫鏈式編程呢?
一步步來實現一個函數式編程
1.新建項目command +shift + N
2.創建一個Person類 並為其增加兩個方法
- (void)run; - (void)study;
簡單實現:
- (void)run{ NSLog(@"run"); } - (void)study { NSLog(@"study") }
3.實例化並調用相關的方法
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)。
響應式編程的概念
在網上流傳一個非常經典的解釋`響應式編程的概念`
在程序開發中: a = b + c
賦值之後 b 或者 c 的值變化後,a 的值不會跟著變化
響應式編程,目標就是,如果 b 或者 c 的數值發生變化,a 的數值會同時發生變化;
在上篇博客中《iOS-Reactive Cocoa的常見用法》Reactive Cocoa就是一個響應式編程的經典作品!