最近寫了個關(guān)于sqlite3的代碼, 突發(fā)奇想, 想用一用用鏈式反應(yīng).
發(fā)現(xiàn)用起來還是很不錯的, 參考Mosonry的使用.
之前在使用 swift 時用過, 也搞過鏈式調(diào)用. 但是, 在工作中, 使用 swift 本身就比較少. 所以搞了也一直沒怎么用過.
這次搞自己的東西, 終于有機會正式的用一用了.
在 OC 中, 鏈式調(diào)用的實現(xiàn), 怎么看要比swfit中的實現(xiàn)簡單很多.
- 要看swift響應(yīng)式反應(yīng)的請看這里. 牛人寫的文章.
實現(xiàn)
原理
- 基本
基本的原理, 是通過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;
- 可傳參數(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);
- 可回調(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)的對象.