標籤:
在接觸到開源項目 Masonry 後,裡面的布局約束的鏈式寫法讓我頗感興趣,就像下面這樣:
| 12345678 |
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);}]; |
其他語言比如 Lua, 實現鏈式文法很容易。但在 Objective-C 中,如何?鏈式文法呢?
註:這裡討論的鏈式文法特指的是點鏈式文法,不同於中括弧鏈式文法,如[[[[someObj method1] method2] method3] method4:someParam]。中括弧鏈式文法相對而言更簡單些,每個方法的傳回值是下一個方法的寄件者即可。
查看 Masonry 源碼,起初沒看明白,於是搜尋了下 Stackoverflow,沒有發現類似的問題,便將這個問題發布在了 Stackoverflow 上。這裡是地址。
總結了下,貼下代碼,做個說明。
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
@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中實現鏈式文法?