使用Block实现链式编程

链式编程就是将多个方法的调用通过.号链接成一句的代码.便代码更加紧凑,可读性非常好,而且降低了代码的重复读,比如以下代码

// 使用普通的方式给p对象的属性赋值
Person *p = [Person new]; // 创建Person的实例对象

p.nameString = @"杨孝远";
p.ageString = @"18";
p.sexString = @"男";
p.favoriteDishString = @"烤鸭";

// 使用链式编程语句给对象的成员变量赋值
NSArray *array = [NSObject makeAtts:^(Person *p) {
   
    p.name(@"杨孝远").age(@"18").sex(@"男").favoriteDish(@"烤鸭");

}];

通过这个例子可以简单看出,链式编程风格要有以下特点

1.通常是都是调用一个方法来给属性赋值,本质上该方法内封装了赋值的语句
2.方法返回值需要是block,block参数:放需要操作的内容,block返回值:当前类对象

链式编程的利弊

优点:使用链式编程最主要的好处是可以使代码更简洁,写起来一种"爽快"感.设计优秀的链式编程可以大大降低重复的代码,增强逻辑感.
缺点:对开发者的业务逻辑能力要求较高,同时因为链式编程都是调用函数,所以有可能会造成过深的函数调用栈.稍微影响性能.

上面的例子实现过程:

自定义Person类继承自NSObject
Person.h文件

#import 
@interface Person : NSObject

@property (nonatomic, strong) NSMutableArray *att;

// 姓名
- (Person *(^)(NSString *))name;
@property (nonatomic, strong) NSString *nameString;

// 年龄
- (Person *(^)(NSString *))age;
@property (nonatomic, strong) NSString *ageString;

// 性别
- (Person *(^)(NSString *))sex;
@property (nonatomic, strong) NSString *sexString;

// 喜欢吃的菜
- (Person *(^)(NSString *))favoriteDish;
@property (nonatomic, strong) NSString *favoriteDishString;
@end

Person.m文件

#import "Person.h"

@implementation Person

// 初始化可变数组
- (NSMutableArray *)att {
    if (_att == nil) {
       _att = [NSMutableArray array];
    }
     return _att;
}
- (Person *(^)(NSString *))name {

    return ^(NSString *str){

        // 将外界传来的姓名添加到数组中
        [self.att addObject:str];
        return self;
    };
}
@end

给NSObject添加一个分类

#import 
@class Person;
@interface NSObject (Att)
+ (NSArray *)makeAtts:(void(^)(Person *p))attBlock;
@end

#import "NSObject+Att.h"
#import "Person.h"

@implementation NSObject (Att)

+ (NSArray *)makeAtts:(void (^)(Person *p))attBlock {

    Person *p = [Person new];

    attBlock(p);
    return p.att;
}
@end

你可能感兴趣的:(使用Block实现链式编程)