接觸到Masonry這一框架后 被它內部簡潔明了的鏈式語法所驚艷到 瞬間鏈式語法就像神奇的魔法棒 通過一行鏈式語言就實現了自動布局 而且完全增加了可讀性 是不是很神奇
先上一段代碼膜拜一下
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
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中實現鏈式語法呢
粗略地了解了一下 原來鏈式語法有中括號鏈式語法和點鏈式語法的區別
中括號鏈式語法 例如 :
[[[[someObj method1] method2] method3] method4:someParam]
每個方法的返回值是下一個方法的發送者 這樣就實現了多個方法連續執行
下面簡單對點鏈式語法做了一個小的練習 不多說 上代碼
@class ClassB;
@interface ClassA : NSObject
// 1. 定義一些 block 屬性
@property(nonatomic, readonly) ClassA *(^aaa)(BOOL enable);
@property(nonatomic, readonly) ClassA *(^bbb)(NSString * str);
@property(nonatomic, readonly) ClassB *(^ccc)(NSString * str);
@implement ClassA
// 2. 實現這些 block 方法,block 返回值類型很關鍵,影響著下一個鏈式
- (ClassA *(^)(BOOL))aaa
{
return ^(BOOL enable) {
//code
if (enable) {
NSLog(@"ClassA yes");
} else {
NSLog(@"ClassA NO");
}
return self;
}
}
- (ClassA * (^)(NSString *))bbb
{
return ^(NSString *str)) {
//code
NSLog(@"%@", str);
return self;
}
}
// 這里返回了ClassB的一個實例,于是后面就可以繼續鏈式 ClassB 的 block 方法
// 見下面例子 .ccc(@"Objective-C").ddd(NO)
- (ClassB * (^)(NSString *))ccc
{
return ^(NSString *str) {
//code
NSLog(@"%@", str);
ClassB *b = [[ClassB alloc] initWithString:ccc];
return b;
}
}
//------------------------------------------
@interface ClassB : NSObject
@property(nonatomic, readonly) ClassB *(^ddd)(BOOL enable);
- (id)initWithString:(NSString *)str;
@implement ClassB
- (ClassB *(^)(BOOL))ddd
{
return ^(BOOL enable) {
//code
if (enable) {
NSLog(@"ClassB yes");
} else {
NSLog(@"ClassB no");
}
return self;
}
}
// 最后我們可以這樣做
id a = [ClassA new];
a.aaa(YES).bbb(@"HelloWorld!").ccc(@"Objective-C").ddd(NO)
這樣就簡單在Objective-C地實現了鏈式語法 不過不得不說 block有時候還真是一個利器