链式编程就是将多个方法的调用通过.号链接成一句的代码.便代码更加紧凑,可读性非常好,而且降低了代码的重复读,比如以下代码
// 使用普通的方式给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 <Foundation/Foundation.h>
@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 <Foundation/Foundation.h>
@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