我們有個對象人,他有兩個方法,一個是學習study,一個是跑步run,
這個人有個怪癖,跑完步之後必須學習,為了實現這個方法並且能調用方便,我們讓跑步和學習都回返回自己這個對象作為下一次調用的快捷方式,代碼如下:
調用:
int main(int argc, const char * argv[])
{
@autoreleasepool {
//初始化人
Person *p = [[Person alloc] init];
//調用
[[p study] run];
return 0;
}
人對象:
// Person.h
#import
@interface Person : NSObject
- (Person *)study;
- (Person *)run;
@end
// Person.m
#import Person.h
@implementation Person
- (Person *)study
{
NSLog(@study----);
return self;
}
- (Person *)run
{
NSLog(@run----);
return self;
}
@end
運行結果
調用:
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[Person alloc] init];
p.study(@xx寶典).run().study(@xx剪發);
}
return 0;
}
人對象:
//Person.h
@interface Person : NSObject
- (Person *(^)(NSString *name))study;
- (Person *(^)())run;
@end
//Person.m
@implementation Person
- (Person *(^)(NSString *))study
{
return ^(NSString *name){
NSLog(@study----%@, name);
return self;
};
}
- (Person *(^)())run
{
return ^{
NSLog(@run----);
return self;
};
}
@end
在這裡面,我們
p.study(@”xx寶典”).run().study(@”xx剪發”);
調用study方法:p.study
執行block:p.study(@”xx寶典”)
結合person內部寫的方法
- (Person *(^)(NSString *))study
{
return ^(NSString *name){
NSLog(@study----%@, name);
return self;
};
}
明顯可以看到,當執行p.study(@”xx寶典”)時候,內部是return一個返回值是person*類型(最後的return self)的block 這也就解釋了為什麼下一句可以繼續連著用點來調用了。也就是說返回的是一段block,這段block裡面又有返回值,返回值是person的對象self。
這裡的參數有點暈,記住就好,用鏈式結構的block的巧妙用法,簡單了解就好
執行結果