block的基礎(chǔ)用法
首先拜一下官方的block圖,忘了的時候瞅一眼。
blocks-3.jpg
如果您對block不是很熟悉,可以看下block官方文檔
鏈?zhǔn)骄幊?/h5>
很多朋友應(yīng)該在平時在工程中常會遇到Masonry這個自動布局庫。這個可以幫助大家簡化自動化布局的代碼,真的是比傳統(tǒng)的自動化布局代碼好看太多,簡潔而充滿藝術(shù)感:
make.top.equalTo(self.view).offset(60)
像這樣通過.語法,將需要執(zhí)行的代碼塊連續(xù)的書寫下去,就是鏈?zhǔn)骄幊?。這樣把代碼寫成一句話,可讀性大大提高了。那么這是如何實現(xiàn)的呢?我在下面寫了一個小demo實現(xiàn)了一個類似棧的功能,最后實現(xiàn)的樣子大概是這樣的:
make.push(2).push(4).pop().push(5).push(6).push(7);
希望您能在看下面代碼的時候先自己思考下,如果是自己實現(xiàn)要怎么寫呢?
小江實現(xiàn)的代碼如下:
@class StackMaker;
@interface StackTool : NSObject
+ (NSMutableArray *)makeStack:(void (^)(StackMaker *make))block;
@end
@implementation StackTool
+ (NSMutableArray *)makeStack:(void (^)(StackMaker *make))block {
StackMaker *make = [[StackMaker alloc] init];
block(make);
return make.result;
}
@end
@interface StackMaker : NSObject
@property (nonatomic, strong) NSMutableArray *result;
- (StackMaker *(^)(int))push;
- (StackMaker *(^)())pop;
@end
@implementation StackMaker
- (id)init {
self = [super init];
if (self) {
_result = [NSMutableArray array];
}
return self;
}
- (StackMaker *(^)(int))push {
return ^StackMaker *(int value){
[_result addObject:@(value)];
return self;
};
}
- (StackMaker *(^)())pop {
return ^StackMaker *() {
[_result removeLastObject];
return self;
};
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *result = [StackTool makeStack:^(StackMaker *make) {
make.push(2).push(4).pop().push(5).push(6).push(7);
}];
NSLog(@"result:%@", result);
}
運行下,結(jié)果如下
2017-01-09 22:54:41.540 MyTestProject[29705:15039270] result:(
2,
5,
6,
7
)
是不是很簡單?block在鏈?zhǔn)骄幊讨兄匾囊稽c就是 方法的返回值要是block,block的返回值為本身對象,block參數(shù)為操作的值。
我們在日常編碼中,這種思想也有很多用武之地,它比較適合每部分操作相對原子化,并把這些操作串聯(lián)在一起的情境下使用,比如數(shù)據(jù)庫操作:
sqlTool.select(nil).from(@"Student").where(@"name = blue").sql;
這樣看起來就又清爽又簡潔
以上,如有問題敬請批評指正~本文系作者原創(chuàng),轉(zhuǎn)載請注明出處