iOS 鏈?zhǔn)秸{(diào)用(method chaining)的實(shí)現(xiàn)

  • method chaining 的方便性

鏈?zhǔn)秸{(diào)用 或者稱為 方法鏈 更合適,method chaining(named parameter idiom),即用.連續(xù)調(diào)用多個(gè)方法,每次方法調(diào)用都返回當(dāng)前對象本身

LYFruitTea *fruitTea = [[LYFruitTea alloc] init]
    .mc_setFruitVariety(LYFruitVariety_Kiwi)
    .mc_setSweetness(30)
    .mc_setIced(YES);

不使用 method chaining 的方法調(diào)用

LYFruitTea *fruitTea = [[LYFruitTea alloc] init];
fruitTea.fruitVariety = LYFruitVariety_Kiwi;
fruitTea.sweetness = 30;
fruitTea.iced = YES;

從上面的代碼比對來看,method chaining 是一個(gè)較為優(yōu)雅的調(diào)用方式,如此設(shè)計(jì)使用讓代碼看起來變得簡潔干凈,優(yōu)點(diǎn)如下:

  1. 調(diào)用過程更接近自然語言,便于閱讀理解
  2. 在數(shù)據(jù)處理方面,可以讓數(shù)據(jù)保持單向流動(dòng)
  3. 將參數(shù)列表復(fù)雜的一個(gè)方法改為參數(shù)列表簡單的多個(gè)方法進(jìn)行調(diào)用
  4. 減少不必要的代碼量

這很有益于開發(fā)效率的提高, 特別是使用者可以很愉快的調(diào)用,當(dāng)然,他也不是萬能的,畢竟他只能返回本身對象的方法里使用


  • method chaining 在 Objective-C 里的實(shí)現(xiàn)
    method chaining 在 Objective-C 中的應(yīng)用,很有名的就有 Masonry
make.left.equalTo(self.XXView.mas_right).mas_offset(8);

那它具體是如果在 Objective-C 實(shí)現(xiàn)的呢?其實(shí)就是 block 的一個(gè)使用
首先.的用法在Objective-C里多見于屬性的調(diào)用(或者無參數(shù)設(shè)置的方法),同時(shí)屬性的setter/getter 為自動(dòng)補(bǔ)足,最終其實(shí)依然是[fruitTea setFruitVariety:LYFruitVariety_Kiwi];的方法調(diào)用,所以.其實(shí)算是語法糖

@property (nonatomic, assign) LYFruitVariety fruitVariety;
- (LYFruitTea *)reserve;

//使用
LYFruitTea *fruitTea = [[LYFruitTea alloc] initWith:self];
fruitTea.fruitVariety = self.fruitVariety;
fruitTea.reserve;

到了這里是不是想到只要將無參數(shù)設(shè)置的方法返回對象本身就可以了,確實(shí)如此,可是總不能沒有參數(shù)設(shè)置吧,還需要能通過()傳參,這在 Objective-C 中即 block 能實(shí)現(xiàn),返回一個(gè)帶參的block,并且這個(gè)block執(zhí)行后返回對象本身

@property (nonatomic, strong, readonly) LYFruitTea *(^mc_setFruitVariety)(LYFruitVariety fruitVariety);

//實(shí)現(xiàn)
- (LYFruitTea *(^)(LYFruitVariety))mc_setFruitVariety {
    __weak typeof(self) wSelf = self;
    return ^LYFruitTea *(LYFruitVariety fruitVariety){
        __strong typeof(wSelf) sSelf = wSelf;
        sSelf.fruitVariety = fruitVariety;
        return sSelf;
    };
}

  • method chaining 在 Swift 里的實(shí)現(xiàn)
    其實(shí) Swift 中實(shí)現(xiàn) method chaining 更簡單方便,Swift 就是通過.()來調(diào)用的,只需在方法后返回對象本身就可以
func setFruitVariety(_ fruitVariety: LYFruitVariety) -> LYFruitTea {
    self.fruitVariety = fruitVariety
    return self
}

剛開始看還是有點(diǎn)繞,通過 . 來實(shí)現(xiàn)屬性調(diào)用,通過 block 實(shí)現(xiàn)傳參,同時(shí) block 執(zhí)行運(yùn)算后返回對象本身即可實(shí)現(xiàn)通過 . 連續(xù)調(diào)用了

雖然通過這種方式在實(shí)現(xiàn)上層次更深了,同時(shí)性能上降了一丟丟,但是對于使用者來說,使用上閱讀上簡直不要太爽,效率都提高了不少呢,原來一天碼/讀100行,現(xiàn)在一口氣碼/讀1000行都不累了有木有?(?????????)?,比藍(lán)瓶鈣還有效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容