最近看到很多关于Objective-C链式编程的文章,我还是不甚了解。有人模仿Manory写了计算器,我参考了并研究了一下,总结了Objective-C可以实现链式编程的原因和条件。
先附上Demo代码
Fruite.h
@interface Fruite : NSObject
// 在OC中,可以通过点语法调用无参方法(why?),这是OC可以实现链式编程的根本条件
- (void)func;
// 通过以下两个方法可以看出,链式编程条件:1.该Block作为无参方法的返回值 2.该Block返回值为对象实例
- (Fruite * (^) (NSString *))addFruite; // 此方法为无参方法,可以链式调用
- (Fruite * (^) ())addFruite:(NSString *)oneFruite;// 此方法为有参函数,不能链式调用
@end
Fruite.m
#import "Fruite.h"
#define WeakFruite() __weak typeof(self) weakself = self
@interface Fruite ()
@property (nonatomic, copy) NSString *fruiteName;
@end
@implementation Fruite
#pragma mark - description
- (NSString *)description {
return self.fruiteName;
}
#pragma mark - getters
- (NSString *)fruiteName {
if (!_fruiteName) {
_fruiteName = @"Apple";
}
return _fruiteName;
}
#pragma mark - chain methods
- (void)func {
NSLog(@"this is func.");
}
// 1.使用Block作为返回值的原因,是因为Block可以直接跟(参数),这种调用类似于C语言方法调用;
// 2.Block返回值为self,保证可以链式调用
- (Fruite * (^) (NSString *))addFruite {
WeakFruite();
return ^ (NSString *oneFruite) {
weakself.fruiteName = [NSString stringWithFormat:@"%@_%@", weakself.fruiteName, oneFruite];
};
}
- (Fruite * (^) ())addFruite:(NSString *)oneFruite {
WeakFruite();
return ^ {
weakself.fruiteName = [NSString stringWithFormat:@"%@_%@", weakself.fruiteName, oneFruite];
};
}
@end
调用:
Fruite *fruite = [Fruite new];
fruite.func;
fruite.addFruite(@"Oriange").addFruite(@"Banana");
NSLog(@"%@", fruite.description);
[fruite addFruite:@"Mango"]();
NSLog(@"%@", fruite.description);
打印结果:
this is func.
Apple_Oriange_Banana
Apple_Oriange_Banana_Mango
研究了半天,总算明白了Objective-C可以实现链式编程的原因及条件,总结如下:
Objective-C可以实现链式编程的根本原因:在Objective-C中,可以通过点语法调用无参方法。
Objective-C实现链式编程的条件:1.该Block作为无参方法的返回值 2.该Block返回值为对象实例。
但是我还是没搞明白,点语法为什么可以调用无参方法呢?…