热门搜索 :
考研考公
您的当前位置:首页正文

链式编程(函数式编程)

来源:东饰资讯网

链式编程是什么?

不讲百度得到的概念,就说自己的感受吧。OC比较让人郁闷的就是方法的调用上,如:person对象想调用它的一个对象方法doSomething,得用[person doSomething]; 而不是像Swift一样,直接使用点语法,这样在开发中会比较直观地看到。(个人观点)
直到遇到Masonry,我才对链式编程有了一定了解。

[targetView mas_makeConstraints:^(MASConstraintMaker *make) { 
    make.bottom.equalTo(self.view).offset(-20); 
    make.leading.equalTo(self.view).offset(20);
    make.size.mas_equalTo(CGSizeMake(100, 100));
}];
基本上链式编程的实现简单直接讲就是使用block作为属性,来代替对象方法,而且在block中,将对象作为返回值,所以下一个block能够直接用点语法调用。

下面我用一个简单的demo实现一下链式编程,有什么不妥的地方希望大家指正。

//首先创建一个SayHello的类,里面有的成员变量有3个block,以及一个计数器;
@interface SayHello : NSObject

@property (copy,nonatomic) SayHello * (^sayhello)(NSString * human);

@property (copy,nonatomic) SayHello * (^eatSomething)(NSString * food);

@property (copy,nonatomic) SayHello * (^watchTV)(NSString * movie);

@property (assign,nonatomic) NSInteger count;

@end

接下来实例化成员变量

@implementation SayHello

- (instancetype)init{
    self = [super init];
    if (!self) {
        return nil;
    }
    self.count = 0;
    return self;
}
/***** 可以看到,每次实例化block之后,都会把当前对象返回,作为下一个block调用的对象 ******/
- (SayHello * (^)(NSString * human))sayhello{
    
    return ^id(NSString * human){
        self.count ++;//每一次调用block计数器+1
        NSLog(@"%@-sayhello",human);
        return self;
    };
    
}

- (SayHello * (^)(NSString * food))eatSomething{
    
    return ^id(NSString * food){
        self.count ++;//每一次调用block计数器+1
        NSLog(@"eating-%@",food);
        return self;
    };
}

- (SayHello * (^)(NSString * watchTV))watchTV{
    
    return ^id(NSString * watchTV){
        self.count ++;//每一次调用block计数器+1
        NSLog(@"watching-%@",watchTV);
        return self;
    };
}
@end

创建一个SayHello对象,来验证链式编程效果能否实现。

- (void)viewDidLoad {
    
    [super viewDidLoad];

    SayHello * sayH = [[SayHello alloc]init];
    
    sayH.sayhello(@"huang").eatSomething(@"apple").watchTV(@"News");
    
    NSLog(@"总共调用了 %ld 次block",sayH.count);
}

运行程序打印出来的结果如下:


链式编程运行结果.png

实现了链式编程效果。

Top