先来看一下 Masonry 框架的链式语法调用
make.right.equalTo(self.right).inserts(8);
我们点开 right 对象查看头文件中的声明发现类型是一个 MASConstraint 对象
@property (nonatomic, strong, readonly) MASConstraint *right;
我们再点开 equalTo 的声明查看,发现 equalTo 方法返回的是一个 block ,而 block有返回的是一个 MASConstraint 类型,和 right 属于一个类型。
- (MASConstraint * (^)(id))equalTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
};
}
inserts 方法以此类推...
综上所述,要实现一个链式调用,对象中的方法必须返回当前对象,如需要使用block这种括号()形式,返回值就必须是一个 block。
有了以上方法,我们来写一个 demo,这里以 NSString 为例,新建一个 NSString 的分类,添加一个 append 方法,用于实现字符串拼接的功能。
@interface NSString (AppendString)
- (NSString *(^)(NSString *string))append;
@end
实现部分
@implementation NSString (AppendString)
- (NSString * _Nonnull (^)(NSString * _Nonnull))append {
return ^(NSString *string) {
if (!string.length) {
return self;
}
return [self stringByAppendingString:string];;
};
}
@end
最后使用链式语法调用
// 使用链式语法,构成简洁的代码
NSString *string = @"Hello";
NSLog(@"%@", string.append(@" ").append(@"world"));
NSLog(@"%@", @"My".append(@" ").append(@"name").append(@" ").append(@"is").append(@" ").append(@"lili"));
控制台输出:
019-06-24 21:59:46.419181+0800 Block[35210:4572524] Hello world
2019-06-24 21:59:46.419218+0800 Block[35210:4572524] My name is lili
由于demo代码很少就不另外提供demo地址了。