你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 如何在Objective

如何在Objective

編輯:IOS開發基礎

在接觸到開源項目 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);
}];

其他語言比如 Lua, 實現鏈式語法很容易。但在 Objective-C 中,如何實現鏈式語法呢?

注:這裡討論的鏈式語法特指的是點鏈式語法,不同於中括號鏈式語法,如[[[[someObj method1] method2] method3] method4:someParam]。中括號鏈式語法相對而言更簡單些,每個方法的返回值是下一個方法的發送者即可。

查看 Masonry 源碼,起初沒看明白,於是搜索了下 Stackoverflow,沒有發現類似的問題,便將這個問題發布在了 Stackoverflow 上。這裡是地址。

總結了下,貼下代碼,做個說明。

@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)

(原文地址 作者:ChildhoodAndy)

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved