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、最后
学无止境,且行却珍惜。写博客经验不多,希望看到本篇博客的大佬们多多留言扶正。后续会继续更新其他学习相关。
网友评论