鏈?zhǔn)骄幊趟枷耄菏菍⒍鄠€(gè)操作(多行代碼)通過點(diǎn)號(hào)(.)鏈接在一起成為一句代碼,使代碼可讀性好寄纵。a(1).b(2).c(3)
鏈?zhǔn)骄幊烫攸c(diǎn):方法的返回值是block,block必須有返回值(本身對(duì)象),block參數(shù)(需要操作的值)
代表:masonry框架。
例子:模仿masonry,寫一個(gè)加法計(jì)算器,練習(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)容在這里 使其框架高聚合
//這個(gè)make.top.left.bottom.right.equalTo就是一個(gè)block 通過block()來調(diào)用
make.top.left.bottom.right.equalTo(@10);
}];
首先我們來 試著寫出 這樣的形式的計(jì)算起來
make.top.left.bottom.right.equalTo(@10)
-
首先我們先創(chuàng)建一個(gè)計(jì)算器的管理器類 寫一個(gè)方法 就以加法 為例
- 其余的方法同理
.h文件
@property (nonatomic, assign) int result;
- (CaculatorMaker *(^)(int num))add;
.m文件實(shí)現(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解
因?yàn)?add(10)之后 還要使用.add(20) 所以不能返回int 一定要返回 CaculatorMaker 類型這樣才能一直點(diǎn)下去
CaculatorMaker *(^)(int number) 這個(gè)返回值是一個(gè) 返回值 CaculatorMaker 參數(shù)是:int 類型
而且 剛好返回的是 相當(dāng)于 這個(gè)返回值 和返回的代碼塊就是一個(gè)block的定義~~
所以外部調(diào)用的時(shí)候 add 相當(dāng)于block 要想調(diào)用就直接 block(需要傳遞的參數(shù))
CaculatorMaker *(^)(int number) = ^(int number){
self.result+= number;
return self;
};
** 但是現(xiàn)在還是有個(gè)問題 **
- 沒有高聚合 沒有把需要計(jì)算的代碼放在一塊
- 而且每次每次都要使用創(chuàng)建一個(gè)類來計(jì)算 所以我們來創(chuàng)建一個(gè)分類方所有的類都可以計(jì)算
分類中
#import "NSObject+Caculator.h"
#import "CaculatorMaker.h"
@implementation NSObject (Caculator)
//設(shè)置一個(gè)返回值為int 接受 最終的結(jié)果?
//在這里面創(chuàng)建 CaculatorMaker計(jì)算類 在通過block參數(shù)傳出去 就不需要把其暴露在外面了
//如果這個(gè)方法被調(diào)用 就先創(chuàng)建 CaculatorMaker * make 然后在 回調(diào)傳進(jìn)來的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í)行耗時(shí)操作");
//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í)慣,把事情封裝到一個(gè)方法中,
- 鏈?zhǔn)骄幊趟枷?把要做的事情封裝到block,給外界提供一個(gè)返回這個(gè)Block的方法
- 鏈?zhǔn)骄幊趟枷敕椒ㄌ攸c(diǎn):方法返回值必須是block,block參數(shù):放需要操作的內(nèi)容,block返回值:方法調(diào)用者
參考Demo:鏈?zhǔn)骄幊?-增強(qiáng)代碼的可讀性
工具的框架:鏈?zhǔn)骄幊?工具類
提煉Fundation最基本功能和最常見功能的寫法。