Object-C OC 實現(xiàn)鏈式調(diào)用.

最近寫了個關(guān)于sqlite3的代碼, 突發(fā)奇想, 想用一用用鏈式反應(yīng).
發(fā)現(xiàn)用起來還是很不錯的, 參考Mosonry的使用.

關(guān)于 iOS sqlite 的文章.

之前在使用 swift 時用過, 也搞過鏈式調(diào)用. 但是, 在工作中, 使用 swift 本身就比較少. 所以搞了也一直沒怎么用過.
這次搞自己的東西, 終于有機會正式的用一用了.

在 OC 中, 鏈式調(diào)用的實現(xiàn), 怎么看要比swfit中的實現(xiàn)簡單很多.

  • 要看swift響應(yīng)式反應(yīng)的請看這里. 牛人寫的文章.

實現(xiàn)

原理
  1. 基本

基本的原理, 是通過getter方法實現(xiàn). getter的實現(xiàn), 使可以通過 . 語法調(diào)用方法.
實現(xiàn)一個getter 返回一個可以繼續(xù)調(diào)用getter的對象.
基本形式:

- (ChainAble *)onCall {
    return (ChainAble *)obj; 
}
  • 例:
@interface Chain : NSObject

- (Chain *)onCall;
@end

@implementation Chain

- (Chain *)onCall {
    return self;
}
@end


Chain *chain = [[Chain alloc] init];
// 通 . 的方法調(diào)用getter
chain.onCall;
  1. 可傳參數(shù)

可傳參數(shù)實質(zhì)上是實現(xiàn)了block的getter.
block的類型大概是:

  • ChainAble *(^)(Paramter);

getter 形式:

- (ChainAble *(^)(Paramter))onArgs {
    // 返回值, 是block的實現(xiàn).
    return ^(Paramter) {
    // 對參數(shù) Paramter 做一些事情
        return (ChainAble *)obj;
    }
}

  • 例:
// 實現(xiàn)
@interface Chain : NSObject

- (Chain *)onCall;

- (Chain *(^)(int))onArgs;
@end

@implementation Chain

- (Chain *)onCall {
    return self;
}

- (Chain *(^)(int))onArgs {
    return ^(int i) {
        NSLog(@"%d", i);
        return self;
    };
}
@end

    // 使用
    Chain *chain = [[Chain alloc] init];
    int i = 0;
    chain.onCall.onArgs(1);
    chain.onArgs(i);
  1. 可回調(diào)

本質(zhì)上與 2. 中的實現(xiàn)是一樣. 只不過在block的參數(shù), 傳入了另外一個block.

  • 例:
// 實現(xiàn)
@interface Chain : NSObject

- (Chain *)onCall;

- (Chain *(^)(int))onArgs;

- (Chain *(^)(int, void(^)(void)))onBack;
@end

@implementation Chain

- (Chain *)onCall {
    return self;
}

- (Chain *(^)(int))onArgs {
    return ^(int i) {
        NSLog(@"%d", i);
        return self;
    };
}

- (Chain *(^)(int, void(^)(void)))onBack {
    return ^(int i, void(^block)(void)) {
        NSLog(@"%d", i);
        if (block) {
            block();
        }
        return self;
    };
}
@end

    // 使用
    Chain *chain = [[Chain alloc] init];
    int i = 0;
    chain.onBack(i, ^(){
        NSLog(@"chain callback!");
    });
特別地!

getter 無論是直接返回, 還是在block中返回的對象并非一定是self. 也可以是void, 其他任意對象, 也可以是其他可鏈式式反應(yīng)的對象.

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

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