1、前言
我們都知道,Masonry是可以實(shí)現(xiàn)make.left.mas_equalTo(@15);這種寫法,那Masonry大神是如何實(shí)現(xiàn)的呢?下面我們通過一個(gè)例子進(jìn)行探究。
2、實(shí)例探究
我們來試想這樣一個(gè)場景,我們想實(shí)現(xiàn)一個(gè)Person類,類中有如下三個(gè)屬性:
@interface Person ()
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *phoneNum;
@property (nonatomic, copy) NSString *address;
@end
那我們?nèi)绾螌?shí)現(xiàn)self.name(@"塵埃").phoneNum(@"123").address(@"北京")?
在這里我們需要思考兩個(gè)問題:
1、如何使用 . 鏈?zhǔn)秸{(diào)用?
2、如何傳參?
第一個(gè)問題相對簡單,我們都知道實(shí)現(xiàn) . 的調(diào)用,本質(zhì)就是使用當(dāng)前對象調(diào)用方法,從而進(jìn)行消息轉(zhuǎn)發(fā),那我在每一個(gè)屬性的返回值返回當(dāng)前對象self就可以了。例如下圖:
- (Person *)name {
NSLog(@"名字是?");
return self;
}
- (Person *)phoneNum {
NSLog(@"手機(jī)號(hào)是?");
return self;
}
- (Person *)address {
NSLog(@"地址是?");
return self;
}
就可以使用self.name.phoneNum.address來調(diào)用啦。
第二個(gè)問題:傳參。我們知道傳參有多種方式:block,代理,通知,函數(shù)指針等等,因?yàn)槲覀儍H僅是兩個(gè)值之間的傳值,所以代理、通知、函數(shù)指針等都可以排除掉。那block的優(yōu)勢是什么呢?
我們知道block相當(dāng)于儲(chǔ)存代碼塊,那對于block如何使用,我們繼續(xù)向下看。
- (Person * (^)(NSString *))name {
return ^(NSString *personName) {
NSLog(@"名字是%@", personName);
return self;
};
}
- (Person * (^)(NSString *))phoneNum {
return ^(NSString *phoneNum) {
NSLog(@"手機(jī)號(hào)是%@", phoneNum);
return self;
};
}
- (Person * (^)(NSString *))address {
return ^(NSString *address) {
NSLog(@"地址是%@", address);
return self;
};
}
如上代碼所示,返回一個(gè)帶有實(shí)例對象返回值類型的block就可以了。以上我們就可以實(shí)現(xiàn)本章的最終目的了。
調(diào)用self.name(@"塵埃").phoneNum(@"123").address(@"北京")結(jié)果為:
名字是塵埃
手機(jī)號(hào)是123
地址是北京
以上就是我們對所有類似鏈?zhǔn)骄幊痰奶骄苛恕?/p>
3、最后
學(xué)無止境,且行卻珍惜。寫博客經(jīng)驗(yàn)不多,希望看到本篇博客的大佬們多多留言扶正。后續(xù)會(huì)繼續(xù)更新其他學(xué)習(xí)相關(guān)。