鏈?zhǔn)骄幊叹褪菍⒍鄠€(gè)方法的調(diào)用通過(guò).號(hào)鏈接成一句的代碼.便代碼更加緊湊,可讀性非常好狸吞,而且降低了代碼的重復(fù)讀,比如以下代碼
// 使用普通的方式給p對(duì)象的屬性賦值
Person *p = [Person new]; // 創(chuàng)建Person的實(shí)例對(duì)象
p.nameString = @"楊孝遠(yuǎn)";
p.ageString = @"18";
p.sexString = @"男";
p.favoriteDishString = @"烤鴨";
// 使用鏈?zhǔn)骄幊陶Z(yǔ)句給對(duì)象的成員變量賦值
NSArray *array = [NSObject makeAtts:^(Person *p) {
p.name(@"楊孝遠(yuǎn)").age(@"18").sex(@"男").favoriteDish(@"烤鴨");
}];
通過(guò)這個(gè)例子可以簡(jiǎn)單看出,鏈?zhǔn)骄幊田L(fēng)格要有以下特點(diǎn)
1.通常是都是調(diào)用一個(gè)方法來(lái)給屬性賦值,本質(zhì)上該方法內(nèi)封裝了賦值的語(yǔ)句
2.方法返回值需要是block,block參數(shù):放需要操作的內(nèi)容火脉,block返回值:當(dāng)前類(lèi)對(duì)象
鏈?zhǔn)骄幊痰睦?/p>
優(yōu)點(diǎn):使用鏈?zhǔn)骄幊套钪饕暮锰幨强梢允勾a更簡(jiǎn)潔,寫(xiě)起來(lái)一種"爽快"感.設(shè)計(jì)優(yōu)秀的鏈?zhǔn)骄幊炭梢源蟠蠼档椭貜?fù)的代碼,增強(qiáng)邏輯感.
缺點(diǎn):對(duì)開(kāi)發(fā)者的業(yè)務(wù)邏輯能力要求較高,同時(shí)因?yàn)殒準(zhǔn)骄幊潭际钦{(diào)用函數(shù),所以有可能會(huì)造成過(guò)深的函數(shù)調(diào)用棧.稍微影響性能.
上面的例子實(shí)現(xiàn)過(guò)程:
自定義Person類(lèi)繼承自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
// 初始化可變數(shù)組
- (NSMutableArray *)att {
if (_att == nil) {
_att = [NSMutableArray array];
}
return _att;
}
- (Person *(^)(NSString *))name {
return ^(NSString *str){
// 將外界傳來(lái)的姓名添加到數(shù)組中
[self.att addObject:str];
return self;
};
}
@end
給NSObject添加一個(gè)分類(lèi)
#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