iOS的鏈式開發

前言

咱們開發過程中不少時候會對一個對象的屬性屢次設置參數,好比設置一個UILable和UIButton時候,會屢次使用點語法setter和getter屬性,步驟繁瑣,因而我就想起了SDAutoLayoutMasonry當中使用的鏈式編程結構,並且如今不少的比較成熟的第三方框架也愈來愈多的使用這種開發方式。ios

這種編程方式最大的優勢就是一次開發,後面使用都是迅速調用,省去繁瑣的屢次調用點語法,但也有缺點,初次開發代碼量較大,語法複雜。可是對於經常使用的一些類來講基本是一次開發終生受益。git

使用方法

Masonry的使用方法

SDAutoLayout的使用方法

實現原理

經過上面兩個例子,咱們嘗試推測一下大概的結構:github

  1. 鏈式語法每一次調用都會調用點語法
  2. 又由於一般狀況下在OC調用方法當中,通常使用中括號來調用,因此能夠推測調用的是Block
  3. 又由於鏈式編程的語法是連續調用,而且不少時候是無序的連續調用方法,因此咱們能推測出,每次調用返回的應該是這個類的實例對象

咱們先看看上面兩個的實現原理

Masonry

- (MASConstraint * (^)(CGFloat))offset {
     return ^id(CGFloat offset){
         self.offset = offset;
         return self;
     };
 }複製代碼

SDAutoLayout

typedef SDAutoLayoutModel *(^MarginToView)(id viewOrViewsArray, CGFloat value);//getter方法的返回值

 - (MarginToView)leftSpaceToView
 {
     if (!_leftSpaceToView) {
         _leftSpaceToView = [self marginToViewblockWithKey:@"left"];
     }
     return _leftSpaceToView;
 }

 - (MarginToView)marginToViewblockWithKey:(NSString *)key
 {
     __weak typeof(self) weakSelf = self;
     return ^(id viewOrViewsArray, CGFloat value) {
     SDAutoLayoutModelItem *item = [SDAutoLayoutModelItem new];
     item.value = @(value);
     if ([viewOrViewsArray isKindOfClass:[UIView class]]) {
         item.refView = viewOrViewsArray;
     } else if ([viewOrViewsArray isKindOfClass:[NSArray class]]) {
         item.refViewsArray = [viewOrViewsArray copy];
     }
     [weakSelf setValue:item forKey:key];
     return weakSelf;
   };
 }複製代碼

經過以上咱們能夠看出,基本和咱們以前推測的是同樣的:使用點語法、運用Block回調、返回值是調用的實例對象。編程

咱們簡單分析一下

Masonry的方法作例子bash

- (MASConstraint * (^)(CGFloat))offset {
     return ^id(CGFloat offset){
         self.offset = offset;
         return self;
     };
}複製代碼

以上方法能夠看作做爲一個getter方法,由於在咱們使用點語法的過程中,這個方法必須是有返回參數,可是無傳入參數,因此這個方法正好能夠看作是offset這個屬性的getter方法來使用,也就是說能夠直接用點語法來調用。框架

應該會有人來發問,offset的參數是怎麼傳進來的?
.offset(5)當中,(5)是整個Block的參數,而且也是做爲Block的參數傳出去,由於BLock的返回值參數用於從外向內返回參數傳遞結果,這就是爲何咱們從外面傳入參數,在內部會獲得參數數值的緣由。ui

返回的參數是一個Block,MASConstraint是Block返回值的類型,CGFloat是Block返回參數的類型。以上都是Block的基礎用法,要是看的不是很明白,能夠看一下我下面的參考文件。spa

咱們分析一下調用過程

  1. make.left.offset 獲得的是一個Block
  2. make.left.offset(5) 傳入參數以後,執行Block,返回值爲MASConstraint的對象,因此以後仍然能夠繼續調用其餘MASConstraint的方法。

使用場景

我以爲使用場景其實不少,看我的需求了,可是我總結的不外乎如下幾點:code

  1. 須要取得返回值以後不斷的進行下一步運算,好比加減乘除計算器。
  2. 須要連續設置一個實例的參數,好比設置UILable的屬性等,再也不須要連篇累牘的屢次書寫點語法來設置屬性。

可是以上總結起來,其實就是須要對一個對象進行連續且重複操做的是時候須要使用鏈式編程的語法。cdn

參考推薦項目

參考

另外

相關文章
相關標籤/搜索