美文网首页
模拟 Masonry 框架的链式语法调用 [函数式编程]

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

作者: 会飞的超大鱼 | 来源:发表于2019-06-24 22:33 被阅读0次

    先来看一下 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 框架的链式语法调用 [函数式编程]

          本文链接:https://www.haomeiwen.com/subject/axbaqctx.html