鏈?zhǔn)骄幊?通過.將多行代碼合成一行

鏈?zhǔn)骄幊趟枷耄菏菍⒍鄠€操作(多行代碼)通過點號(.)鏈接在一起成為一句代碼,使代碼可讀性好。a(1).b(2).c(3)

鏈?zhǔn)骄幊烫攸c:方法的返回值是block,block必須有返回值(本身對象),block參數(shù)(需要操作的值)

代表:masonry框架。

例子:模仿masonry,寫一個加法計算器,練習(xí)鏈?zhǔn)骄幊趟枷搿?/p>

  • 首先我們來了解一下masonry
UIView * redView =[[UIView alloc] init];
   UIView * redView =[[UIView alloc] init];
    redView.backgroundColor=[UIColor redColor];
    [self.view addSubview:redView];
    
    [redView mas_makeConstraints:^(MASConstraintMaker *make) {
        //把所有的需要設(shè)置的內(nèi)容在這里 使其框架高聚合
        //這個make.top.left.bottom.right.equalTo就是一個block 通過block()來調(diào)用
        make.top.left.bottom.right.equalTo(@10);
    }];

  1. 首先我們來 試著寫出 這樣的形式的計算起來 make.top.left.bottom.right.equalTo(@10)

  2. 首先我們先創(chuàng)建一個計算器的管理器類 寫一個方法 就以加法 為例

    • 其余的方法同理
 .h文件 
@property (nonatomic, assign)  int result;
- (CaculatorMaker *(^)(int num))add;


.m文件實現(xiàn)
-( CaculatorMaker *(^)(int number))add{
  return ^(int number){
       self.result+= number;
       return self;
  };
}
外部的調(diào)用:
  CaculatorMaker *maker = [[CaculatorMaker alloc] init];
  int result = [maker.add(10).add(20).add(30).add(40) result];
  

Block返回值和鏈?zhǔn)骄幊淘淼闹v解

因為 add(10)之后 還要使用.add(20) 所以不能返回int 一定要返回 CaculatorMaker 類型這樣才能一直點下去

CaculatorMaker *(^)(int number) 這個返回值是一個 返回值 CaculatorMaker 參數(shù)是:int 類型

而且 剛好返回的是 相當(dāng)于 這個返回值 和返回的代碼塊就是一個block的定義~~

所以外部調(diào)用的時候 add 相當(dāng)于block 要想調(diào)用就直接 block(需要傳遞的參數(shù))
CaculatorMaker *(^)(int number) = ^(int number){
self.result+= number;
return self;
};

** 但是現(xiàn)在還是有個問題 **

  • 沒有高聚合 沒有把需要計算的代碼放在一塊
  • 而且每次每次都要使用創(chuàng)建一個類來計算 所以我們來創(chuàng)建一個分類方所有的類都可以計算
分類中
#import "NSObject+Caculator.h"
#import "CaculatorMaker.h"
@implementation NSObject (Caculator)

//設(shè)置一個返回值為int 接受 最終的結(jié)果?
//在這里面創(chuàng)建  CaculatorMaker計算類 在通過block參數(shù)傳出去 就不需要把其暴露在外面了
//如果這個方法被調(diào)用 就先創(chuàng)建  CaculatorMaker * make 然后在 回調(diào)傳進來的block
//callBack(make)把make傳出去 然后在通過make設(shè)置make.add(10).add(20)
+(int)makeCaculator: (void(^)(CaculatorMaker * make))callBack{
    CaculatorMaker * make =[[CaculatorMaker alloc] init];
    callBack(make);
    return make.result;
}
/**
 *  就相當(dāng)于下面的例子
 */
 /*
[self loadData:^{
    //后執(zhí)行
    NSLog(@"被回調(diào)了");
}];

//block 是作為參數(shù)的
-(void)loadData:(void(^)())finished{
    //先執(zhí)行
    NSLog(@"執(zhí)行耗時操作");
    //block回調(diào)
    finished();
}
*/
@end
  • 外部的調(diào)用
外部的調(diào)用
   // block:使代碼高聚合
 int result =  [NSObject makeCaculator:^(CaculatorMaker *maker) {
        maker.add(10).add(30);
        maker.add(20).add(40);
        maker.multy(2).division(10);
        maker.jian(19);
    }];
    NSLog(@"%d",result);

總結(jié)

  • 之前開發(fā)中比較習(xí)慣,把事情封裝到一個方法中,
  • 鏈?zhǔn)骄幊趟枷?把要做的事情封裝到block,給外界提供一個返回這個Block的方法
  • 鏈?zhǔn)骄幊趟枷敕椒ㄌ攸c:方法返回值必須是block,block參數(shù):放需要操作的內(nèi)容,block返回值:方法調(diào)用者

參考Demo:鏈?zhǔn)骄幊?-增強代碼的可讀性
工具的框架:鏈?zhǔn)骄幊?工具類
提煉Fundation最基本功能和最常見功能的寫法。

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

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

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