常見的OC中括號鏈?zhǔn)秸Z法
[[someClass alloc] init];
Masonry
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top);
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
上圖:點語法:在 Objective-C 中稍途,對于點語法的使用决乎,最常見于屬性的訪問毁兆,比如對在方法內(nèi)部用 self.xxx想许,在類的實例中用 classInstance.xxx河泳;
小括號調(diào)用:Objective-C 中一般用中括號 [] 來實現(xiàn)方法的調(diào)用沃呢,而對于 Block 的調(diào)用則還是保留使用小括號 () 的方式,因此我們可以考慮用 Block 來實現(xiàn)在鏈?zhǔn)秸Z法中的 () 拆挥;
如何實現(xiàn)連續(xù)訪問薄霜?:Block 可理解為帶有自動變量的匿名函數(shù)或函數(shù)指針,它也是有返回值的。我們可以把上述類實例每次方法的調(diào)用(實質(zhì)為 Block 的調(diào)用)的返回值都設(shè)為當(dāng)前類實例本身惰瓜,即 classInstance.method1() 返回了當(dāng)前 classInstance否副,此時可在其后面繼續(xù)進行 .method2() 的調(diào)用,以此類推鸵熟。
總結(jié)一句話就是:
“我們可以定義類的一些只讀的 Block 類型的屬性副编,并把這些 Block 的返回值類型設(shè)為當(dāng)前類本身,然后實現(xiàn)這些 Block 屬性的 getter 方法流强”越欤”
代碼實踐:
// .h 文件
@interface Calculator : NSObject
@property (nonatomic, assign) NSInteger result;//計算結(jié)果
@property (nonatomic, copy, readonly) Calculator *(^add) (NSInteger num);
@property (nonatomic, copy, readonly) Calculator *(^minus) (NSInteger num);
@property (nonatomic, copy, readonly) Calculator *(^multiply) (NSInteger num);
@property (nonatomic, copy, readonly) Calculator *(^devide) (NSInteger num);
// 或者這樣實現(xiàn)也可以
- (Calculator *(^)(NSInteger num)) add;
- (Calculator *(^)(NSInteger num)) minus;
- (Calculator *(^)(NSInteger num)) multiply;
- (Calculator *(^)(NSInteger num)) devide;
@end
// .m 文件
@implementation Calculator
- (instancetype)init
{
self = [super init];
if (self) {
self.result = 0;
}
return self;
}
- (Calculator * _Nonnull (^)(NSInteger))add{
return ^id(NSInteger num){
self.result += num;
return self;
};
}
- (Calculator * _Nonnull (^)(NSInteger))minus{
return ^id(NSInteger num){
self.result -= num;
return self;
};
}
- (Calculator * _Nonnull (^)(NSInteger))multiply{
return ^id(NSInteger num){
self.result *= num;
return self;
};
}
- (Calculator * _Nonnull (^)(NSInteger))devide{
return ^id(NSInteger num){
NSAssert(num != 0, @"除數(shù)不能為零!4蛟隆队腐!");
self.result *= num;
return self;
};
}
測試代碼
Calculator *calc = [[Calculator alloc] init];
calc.add(10).minus(4).multiply(2).devide(3);
NSLog(@"%d",(int)calc.result);
分析:
上面通過 calc.add 訪問 calc 的 add 屬性會調(diào)用 [calc add] 方法,此方法會返回一個 Block 如下:
^id(NSInteger num) {
self.result += num;
return self;
};
在這個 Block 中奏篙,前面已聲明其返回值類型為:Calculator柴淘,所以在其里面返回了 self,
這樣當(dāng)調(diào)用該 Block 時秘通,會返回 self(即類實例本身)为严,流程如下:
(1) calc.add -> 獲得一個 Block;
(2) calc.add(8) -> Block 的執(zhí)行肺稀,并返回了 self(即實例 calc)
(3) 于是在 calc.add(8) 后面可繼續(xù)訪問 calc 的其他屬性第股,實現(xiàn)一路點下去...