1. 程式人生 > >深入淺出iOS函數語言程式設計與響應式程式設計概念

深入淺出iOS函數語言程式設計與響應式程式設計概念

簡介

本篇文章主要回顧一下——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") }

例項化並呼叫相關的方法:

 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的數值會同時發生變化。

感謝作者Yangsc對本文的授權。

第一時間掌握最新移動開發相關資訊和技術,請關注mobilehub公眾微訊號(ID: mobilehub)。

圖片描述

2016年3月18日-19日,由CSDN重磅打造的資料庫核心技術與實戰應用峰會、網際網路應用架構實戰峰會將在上海舉行。這兩場峰會將邀請業內頂尖的架構師和技術專家,共同探討高可用/高併發系統架構設計、新技術應用、移動應用架構、微服務、智慧硬體架構、雲資料庫實戰、新一代資料庫平臺、產品選型、效能調優、大資料應用實戰等領域的熱點話題與技術。

2月29日24點前仍處於最低六折優惠票價階段,單場峰會(含餐)門票只需799元,5人以上團購或者購買兩場峰會通票更有特惠,限量供應,預購從速。(票務詳情連結)。