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、最后

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 8,043评论 2 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,904评论 1 32
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,759评论 0 38
  • 之所以不想回家的原因之一是买个票烦死人。 目前订了2张票了。 花了1200~肯定要退一张。明看看退哪张合适。
    白藜芦醇阅读 681评论 0 0
  • 水是生命之源! 我们每个人都离不开水。 我到泰国旅游的时候,爸爸带我去大海里游泳,海水蓝蓝的、咸咸的...... ...
    潞小豆MaMa阅读 1,544评论 0 1

友情链接更多精彩内容