美文网首页
链式编程

链式编程

作者: jiangamh | 来源:发表于2016-01-08 00:14 被阅读165次

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

    相关文章

      网友评论

          本文标题:链式编程

          本文链接:https://www.haomeiwen.com/subject/novfkttx.html