使用場景:物件呼叫了一個方法想繼續再呼叫另一個方法
方案1.
直接呼叫兩次
1 2 3 |
Person *p = [[Person alloc] init]; [p run]; [p study]; |
方案2
在方法中返回物件本身,來連續呼叫,程式碼相對簡潔
1 2 3 4 5 6 7 8 9 10 |
- (Person *)study { NSLog(@"study----"); return self; } - (Person *)run { NSLog(@"run----"); return self; } |
呼叫效果
1 2 3 |
Person *p = [[Person alloc] init]; [[p run] study]; [[[[p run] study] run] study]; |
方案3
block鏈式,上個方案還是不簡潔,於是有了Block實現鏈式程式設計
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
- (Person *(^)())study { return ^(){ NSLog(@"study---"); return self; }; } - (Person *(^)())run { return ^{ NSLog(@"run----"); return self; }; } |
讓物件方法返回block,block被呼叫再返回物件本身,就可以實現如下呼叫效果
Person *p = [[Person alloc] init];
p.study().run().study();
p.study()實際分為了兩步,先用p.study得到了block,再用括號()呼叫了block。呼叫了block又返回物件本身,於是就可以繼續呼叫方法
如果想傳引數,使用冒號方式定義方法,將不能實現鏈式
1 2 3 4 5 6 7 |
- (Person *(^)())study:(NSString *)name { return ^(){ NSLog(@"study----%@", name); return self; }; } |
只能[p study:@”iOS”]無法鏈式
所以傳引數要傳給block
1 2 3 4 5 6 7 |
- (Person *(^)(NSString *))study { return ^(NSString *name){ NSLog(@"study----%@", name); return self; }; } |
於是就能
1 |
p.study(@"iOS").run().study(@"鏈式程式設計"); |