如何在Objective-C中實現鏈式文法?

來源:互聯網
上載者:User

標籤:

在接觸到開源項目 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中實現鏈式文法?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.