深入淺出-iOS函數式編程 && 響應式編程概念

kmur7200 8年前發布 | 16K 次閱讀 函數式編程 iOS開發 Objective-C開發

來自: http://www.jianshu.com/p/7017a220f34c

簡介

本篇主要回顧一下 --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就是一個響應式編程的經典作品!

 本文由用戶 kmur7200 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!