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渺杉、如何傳參蛇数?
第一個問題相對簡單,我們都知道實現 . 的調用少办,本質就是使用當前對象調用方法苞慢,從而進行消息轉發(fā),那我在每一個屬性的返回值返回當前對象self就可以了英妓。例如下圖:
- (Person *)name {
NSLog(@"名字是挽放?");
return self;
}
- (Person *)phoneNum {
NSLog(@"手機號是?");
return self;
}
- (Person *)address {
NSLog(@"地址是蔓纠?");
return self;
}
就可以使用self.name.phoneNum.address
來調用啦辑畦。
第二個問題:傳參。我們知道傳參有多種方式:block腿倚,代理纯出,通知,函數指針等等敷燎,因為我們僅僅是兩個值之間的傳值暂筝,所以代理、通知硬贯、函數指針等都可以排除掉焕襟。那block的優(yōu)勢是什么呢?
我們知道block相當于儲存代碼塊饭豹,那對于block如何使用鸵赖,我們繼續(xù)向下看。
- (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茫打、最后
學無止境,且行卻珍惜妖混。寫博客經驗不多包吝,希望看到本篇博客的大佬們多多留言扶正。后續(xù)會繼續(xù)更新其他學習相關源葫。