最近接触了RAC,自然也就接触了链式编程,链式编程挺有意思的,代码让人感觉很简洁,masonry中就用到了链式编程,我也学习了一下,写了个简单的代码练习一下链式编程。如AXExtentString类可以采用链式编程的方式追加字符串,代码如下:
@interface AXExtentString : NSObject
-(AXExtentString *(^)(NSString *str))addStr;
-(NSString*)string;
@end
源代码如下:
#import "AXExtentString.h"
@interface AXExtentString ()
@property(nonatomic,copy)NSMutableString *mutableStr;
@end
@implementation AXExtentString
-(id)init
{
if (self = [super init]) {
}
return self;
}
-(AXExtentString *(^)(NSString *str))addStr
{
return ^AXExtentString*(NSString * str){
[self.mutableStr appendString:str];
return self;
};
}
-(NSMutableString*)mutableStr
{
if (!_mutableStr) {
_mutableStr = [NSMutableString string];
}
return _mutableStr;
}
-(NSString*)string
{
return self.mutableStr;
}
@end
模仿masonry写了个分类,代码如下:
#import <Foundation/Foundation.h>
#import "AXExtentString.h"
@interface NSObject (ExtentString)
+(NSString*)makerString:(void(^)(AXExtentString * str))block;
@end
源码:
#import "NSObject+ExtentString.h"
@implementation NSObject (ExtentString)
+(NSString*)makerString:(void(^)(AXExtentString * str))block
{
AXExtentString *str = [[AXExtentString alloc] init];
block(str);
return [str string];
}
@end
使用如下:
- (void)viewDidLoad
{
[super viewDidLoad];
AXExtentString *string =[[AXExtentString alloc] init];
string.addStr(@"have ").addStr(@"a ").addStr(@"test").addStr(@"!");
NSLog(@"string:%@",[string string]);
NSString *str = [NSObject makerString:^(AXExtentString *str) {
str.addStr(@"have ").addStr(@"a ").addStr(@"test").addStr(@"!");
}];
NSLog(@"str:%@",str);
}
运行结果如下:
屏幕快照 2016-01-07 下午11.54.57.png个人对链式编程的理解:
首先方法中没有参数,如addStr函数,运算的参数通过addStr返回的block传递,当然也可以有参数但是就不能全部通过.进行调用,破坏了链式编程的优雅。addStr返回的block也有要求。
block要求1:
block要有返回值类型为对应的类的类型,比如addStr返回的block返回类型为AXExtentString,这是为了保证调用返回的block调用后能返回对应的类型,这样才能继续用.调用addStr函数。
block要求2:
block参数要求,比如addStr返回的block,参数为NSSting类型,因为内部需要这个参数进行运算,当然也可为其他类型,甚至可以没有参数,这取决于你的需求,说白了其实也没有要求,我只是想强调的是这里的参数更多的取决于你的需求,我们要明白类提供的方法没有参数,往往运算需要参数,这里是通过block传递参数的。
代码上传github:https://github.com/jiangtaidi/LsCodeDemo
网友评论