深刻淺出-iOS函數式編程的實現 && 響應式編程概念

原文出處: Yangcs(Yangcs)  編程

簡介

本篇主要回顧一下--iOS函數式編程 && 響應式編程概念 ,如何一步步實現函數式編程的過程,對閱讀Masonry && SnapKit源碼有必定的幫助。swift

配圖架構

做爲一個iOS 開發者,那麼你必定用過Masnory/ SnapKit;框架

  • Masonry是一個OC開發中,很是好用的自動佈局的第三方框架;函數式編程

  • SnapKit是Masonry團隊打造的swift版本的自動佈局框架;
    若是你沒有用過,在自動佈局中用的是蘋果原生的或者原生的升級版VFL語言,那我只好爲你點「贊」!函數

一個典型的Masonry的語句:

 

 

 

1佈局

make.centerY.equalTo(self.view).offset(100);學習

 

就是這個「.」讓Masonry更加鮮活的展現給了開發者,在我心中
Masnory/ SnapKit函數式編程的一個經典的表明做,很是值得參考和學習!網站

鏈式編程的好處不用再說了,用過Masnory/ SnapKit的都知道;spa

那麼問題來了,怎麼寫鏈式編程呢?

一步步來實現一個函數式編程

  1. 新建項目command +shift + N

  2. 建立一個Person類
    併爲其增長兩個方法

     

     

    1

    2

      - (void)run;

      - (void)study;


    簡單實現:

     

     

    1

    2

    3

    4

    5

    6

      - (void)run{

       NSLog(@"run");

      }

      - (void)study {

       NSLog(@"study")

      }

  3. 實例化並調用相關的方法

     

     

    1

    2

    3

    Person*person = [[Personalloc]init];

    [personrun];

    [personstudy];


    以上三步實現了一個很是簡單的程序;

最終目標

 

 

 

1

2

    person.runBlock().studyBlock().runBlock();

    person.studyBlock().studyBlock().runBlock();

 

分解目標
1.先實現這種方式調用

 

 

 

1

      [[person run1] study1];

 

2.再實現最終目標

顯然,若是想要實現[person run1]調用一個方法,那麼run1就須要一個返回一個對象,讓這個對象去調用study1。
這樣分析後,就簡單了,就是增長一個返回值。

代碼
方法的聲明

 

 

 

1

2

-(Person*)run1;

-(Person*)study1;

 

方法的實現

 

 

 

1

2

3

4

5

6

7

8

- (Person*)run1 {

        NSLog(@"run");

        return [[Personalloc] init];

}

- (Person*)study1{

         NSLog(@"study");

         return[[Personalloc]init];

}

 

實現最終目標:

 

 

 

1

    person.runBlock().studyBlock().runBlock();

 

在OC中,`()`block是以()的形式去執行的,猜測若是返回一個block的話,那麼我就能夠用()來實現runBlock()這種效果了吧!
再結合咱們的分解步驟,runBlock()表明執行了一個block,若是這個block的返回值的是一個對象的話,那麼調用另一個方法;這樣就能夠一直連接下去吧!實現了咱們想要的目標!

代碼:
聲明

 

 

 

1

2

- (Person* (^)())runBlock;

- (Person* (^)())studyBlock;

 

實現:

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

- (Person* (^)())runBlock {  

       Person* (^block)() = ^() {            

                NSLog(@"run");          

               return self;        

        };      

       return block;

}

- (Person* (^)())studyBlock {

       Person* (^block)() = ^()  {            

              NSLog(@"study");

              return self;        

       };

        return block;

}

 

再來看一下Masonry的一個函數式編程

 

 

 

1

make.right.equalTo(self.right).insets(kPadding);

 

最終調用的函數:
返回的就是一個返回值爲MASConstraint的block

 

 

 

1

2

3

4

5

- (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就是一個響應式編程的經典做品!

 

問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com

QQ羣290551701 彙集不少互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!

相關文章
相關標籤/搜索