链式编程风格是一种将多个函数调用连接起来,形成一条函数调用链的编程风格。这种风格的代码可以通过返回 self
或某个适当的对象来实现。
下面是一个使用链式编程风格构建的 NSMutableAttributedString 的例子,这个例子将展示如何将一系列的 NSAttributedString 配置操作链接在一起。
首先,我们需要创建一个类 ChainableAttributedBuilder
,它可以用于创建和配置 NSAttributedString:
#import
#import
NS_ASSUME_NONNULL_BEGIN
@interface ChainableAttributedBuilder : NSObject
@property (nonatomic, strong, readonly) NSMutableAttributedString *mutableAttributedString;
- (ChainableAttributedBuilder *(^)(NSString *text))append;
- (ChainableAttributedBuilder *(^)(UIColor *color))textColor;
- (ChainableAttributedBuilder *(^)(UIFont *font))font;
- (ChainableAttributedBuilder *(^)(NSParagraphStyle *style))paragraphStyle;
@end
NS_ASSUME_NONNULL_END
#import "ChainableAttributedBuilder.h"
@implementation ChainableAttributedBuilder
- (instancetype)init {
if (self = [super init]) {
_mutableAttributedString = [[NSMutableAttributedString alloc] init];
}
return self;
}
- (ChainableAttributedBuilder *(^)(NSString *text))append {
return ^(NSString *text) {
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text];
[self.mutableAttributedString appendAttributedString:attributedString];
return self;
};
}
- (ChainableAttributedBuilder *(^)(UIColor *color))textColor {
return ^(UIColor *color) {
[self.mutableAttributedString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, self.mutableAttributedString.length)];
return self;
};
}
- (ChainableAttributedBuilder *(^)(UIFont *font))font {
return ^(UIFont *font) {
[self.mutableAttributedString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, self.mutableAttributedString.length)];
return self;
};
}
- (ChainableAttributedBuilder *(^)(NSParagraphStyle *style))paragraphStyle {
return ^(NSParagraphStyle *style) {
[self.mutableAttributedString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, self.mutableAttributedString.length)];
return self;
};
}
@end
ChainableAttributedBuilder *builder = [[ChainableAttributedBuilder alloc] init];
builder.append(@"Hello ").font([UIFont systemFontOfSize:16]).textColor([UIColor redColor]);
builder.append(@"world!").font([UIFont systemFontOfSize:20]).textColor([UIColor blueColor]);
NSAttributedString *attributedString = builder.mutableAttributedString;
// 现在,attributedString 是一个带有不同样式的 "Hello world!" 的富文本字符串。