使用Block开始链式编程

链式变成最常见的就是Masonry框架的使用了,链式编程可以很直观的表达出编程者的意图。Masonry示例:

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.left.equalTo(self.view).offset(12);
}];

链式编程的要点就是链式编程对象返回的类型必须是block,并且block的返回类型是链式编程对象本身,这样才能形成链条一样的首尾衔接调用。

细细的看下Masonry的源码,就可以模仿着写出自己的链式代码。

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    block(constraintMaker);
    return [constraintMaker install];
}

//////////分割线///////////

- (MASConstraint *)left;

- (MASConstraint *)left {
    return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
}

//////////分割线///////////

- (MASConstraint * (^)(id attr))equalTo;

- (MASConstraint * (^)(id))equalTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
    };
}

上面是Masonry的部分链式代码。

从上面的代码可以看出,返回的对象始终是MASConstrain *的实例。

即使有Block传参数类似equalTo的方法,block的返回类型也是MASConstrain *的实例。这样就保证了链式结构的顺利衔接。

由此,写出自己的计算器链式编程代码:

链式编程对象LinkObject文件:

/////////////////.h文件/////////////////
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface LinkObject : NSObject

@property (nonatomic, assign) CGFloat result;

- (LinkObject *)clear;

- (LinkObject *(^)(NSInteger))add;

- (LinkObject *(^)(NSInteger))sub;

- (LinkObject *(^)(NSInteger))multiply;

- (LinkObject *(^)(NSInteger))devide;

- (void(^)(void))printResult;
@end


/////////////////.m文件/////////////////
#import "LinkObject.h"

@implementation LinkObject

- (LinkObject *)clear {
    _result = 0;
    return self;
}

- (LinkObject *(^)(NSInteger))add {
    return ^id(NSInteger value) {
        _result += value;
        return self;
    };
}

- (LinkObject *(^)(NSInteger))sub {
    return ^id(NSInteger value) {
        _result -= value;
        return self;
    };
}

- (LinkObject *(^)(NSInteger))multiply {
    return ^id(NSInteger value) {
        _result *= value;
        return self;
    };
}

- (LinkObject *(^)(NSInteger))devide {
    return ^id(NSInteger value) {
        _result /= value;
        return self;
    };
}

- (void(^)(void))printResult {
    return ^() {
        NSLog(@"%f", _result);
    };
}

@end

给NSObject添加一个分类方法,模仿Masonry对UIView实现的分类:

/////////////////.h文件/////////////////
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "LinkObject.h"

@interface NSObject (Calculator)

+(CGFloat)makeCalculator:(void(^)(LinkObject *make))block;

@end

/////////////////.m文件/////////////////
#import "NSObject+Calculator.h"

@implementation NSObject (Calculator)

+(CGFloat)makeCalculator:(void(^)(LinkObject *make))block {
    LinkObject *obj = [[LinkObject alloc]init];
    block(obj);
    return obj.result;
}
@end

具体的调用代码:

NSInteger value = [NSObject makeCalculator:^(LinkObject *make) {
        make.clear.add(12).sub(3).devide(3).multiply(10).add(7);
    }];
    
NSLog(@"value   %ld", value);

至此,掌握链式编程的主要精髓所在。(主要是Block的灵活使用)。

文章来自 http://skymonkey.cn/

高能广告区

暂无广告哦=^^=。继续看看其它文章吧!