模拟 Masonry 框架的链式语法调用 [函数式编程]

先来看一下 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地址了。

你可能感兴趣的:(模拟 Masonry 框架的链式语法调用 [函数式编程])