Masonry中链式编程的实现

1、前言

我们都知道,Masonry是可以实现make.left.mas_equalTo(@15);这种写法,那Masonry大神是如何实现的呢?下面我们通过一个例子进行探究。

2、实例探究

我们来试想这样一个场景,我们想实现一个Person类,类中有如下三个属性:

@interface Person () 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) NSString *phoneNum;
@property (nonatomic, copy) NSString *address; 
@end

那我们如何实现self.name(@"尘埃").phoneNum(@"123").address(@"北京")

在这里我们需要思考两个问题:
1、如何使用 . 链式调用?
2、如何传参?

第一个问题相对简单,我们都知道实现 . 的调用,本质就是使用当前对象调用方法,从而进行消息转发,那我在每一个属性的返回值返回当前对象self就可以了。例如下图:

- (Person *)name {
        
    NSLog(@"名字是?");
    return self;
}

- (Person *)phoneNum {
    
    NSLog(@"手机号是?");
    return self;
}

- (Person *)address {
    
    NSLog(@"地址是?");
    return self;
}

就可以使用self.name.phoneNum.address来调用啦。

第二个问题:传参。我们知道传参有多种方式:block,代理,通知,函数指针等等,因为我们仅仅是两个值之间的传值,所以代理、通知、函数指针等都可以排除掉。那block的优势是什么呢?

我们知道block相当于储存代码块,那对于block如何使用,我们继续向下看。

- (Person * (^)(NSString *))name {
    
    return ^(NSString *personName) {
        
        NSLog(@"名字是%@", personName);
        return self;
    };
}

- (Person * (^)(NSString *))phoneNum {
    
    return ^(NSString *phoneNum) {
        
        NSLog(@"手机号是%@", phoneNum);
        return self;
    };
}

- (Person * (^)(NSString *))address {
    
    return ^(NSString *address) {
        
        NSLog(@"地址是%@", address);
        return self;
    };
}

如上代码所示,返回一个带有实例对象返回值类型的block就可以了。以上我们就可以实现本章的最终目的了。
调用self.name(@"尘埃").phoneNum(@"123").address(@"北京")结果为:

名字是尘埃
手机号是123
地址是北京

以上就是我们对所有类似链式编程的探究了。

3、最后

学无止境,且行却珍惜。写博客经验不多,希望看到本篇博客的大佬们多多留言扶正。后续会继续更新其他学习相关。

你可能感兴趣的:(Masonry中链式编程的实现)