利用block實(shí)現(xiàn)簡單鏈?zhǔn)秸Z法

接觸到Masonry這一框架后 被它內(nèi)部簡潔明了的鏈?zhǔn)秸Z法所驚艷到 瞬間鏈?zhǔn)秸Z法就像神奇的魔法棒 通過一行鏈?zhǔn)秸Z言就實(shí)現(xiàn)了自動布局 而且完全增加了可讀性 是不是很神奇

先上一段代碼膜拜一下

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);
}];

不由自主就會想到一個(gè)問題 如何在Objective-C中實(shí)現(xiàn)鏈?zhǔn)秸Z法呢

粗略地了解了一下 原來鏈?zhǔn)秸Z法有中括號鏈?zhǔn)秸Z法和點(diǎn)鏈?zhǔn)秸Z法的區(qū)別

中括號鏈?zhǔn)秸Z法 例如 :
[[[[someObj method1] method2] method3] method4:someParam]
每個(gè)方法的返回值是下一個(gè)方法的發(fā)送者 這樣就實(shí)現(xiàn)了多個(gè)方法連續(xù)執(zhí)行

下面簡單對點(diǎn)鏈?zhǔn)秸Z法做了一個(gè)小的練習(xí) 不多說 上代碼


@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. 實(shí)現(xiàn)這些 block 方法,block 返回值類型很關(guān)鍵,影響著下一個(gè)鏈?zhǔn)?- (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的一個(gè)實(shí)例,于是后面就可以繼續(xù)鏈?zhǔn)?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地實(shí)現(xiàn)了鏈?zhǔn)秸Z法 不過不得不說 block有時(shí)候還真是一個(gè)利器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容