链式编程

最近接触了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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容