鏈?zhǔn)秸Z(yǔ)法:在一行代碼之內(nèi)多次以點(diǎn)調(diào)用的形式調(diào)用方法彩届。鏈?zhǔn)秸Z(yǔ)法能使復(fù)雜的代碼使用簡(jiǎn)化桐款,看起來(lái)非常的優(yōu)雅晤揣。
Objective-C中一個(gè)經(jīng)典的使用鏈?zhǔn)秸Z(yǔ)法的例子就是著名的Masonry刀森。https://github.com/SnapKit/Masonry
AutoLayout技術(shù)如果不用xib來(lái)設(shè)置杠览,選擇用代碼寫(xiě)的話,原生代碼寫(xiě)法非常繁瑣当宴。例如
[aView addConstraints:@[
[NSLayoutConstraint constraintWithItem:aView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:bView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0],
[NSLayoutConstraint constraintWithItem:aView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:bView
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:2.0]]];
用Masonry提供的鏈?zhǔn)秸Z(yǔ)法則十分簡(jiǎn)潔
[aView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(bView.mas_top);
make.left.equalTo(bView.mas_left).offset(2);
}];
鏈?zhǔn)秸Z(yǔ)法有兩個(gè)關(guān)鍵:
- 用點(diǎn)調(diào)用函數(shù)畜吊,且可傳入?yún)?shù)
- 一行語(yǔ)句可以無(wú)限調(diào)用,無(wú)限延伸
要做到第一點(diǎn)户矢,必須使用block玲献;要做到第二點(diǎn),鏈?zhǔn)街械拿恳淮握{(diào)用的返回類(lèi)型必須支持繼續(xù)調(diào)用下一次梯浪。
說(shuō)的比較抽象捌年,舉個(gè)栗子~
比如用鏈?zhǔn)秸Z(yǔ)法擴(kuò)展NSDictionary的語(yǔ)法
NSDictionary *arr = @{}.append(@"first", @"apple").append(@"second", @"orange").append(@"third", @"red").append(@"forth", @"green");
dictionary.png
實(shí)現(xiàn)方法
static inline id _dictionaryWithValue(id dictionary, id value, NSString *key) {
if ([dictionary isKindOfClass:[NSMutableDictionary class]]) {
[dictionary setValue:value forKey:key];
return dictionary;
} else if ([dictionary isKindOfClass:[NSDictionary class]]) {
NSMutableDictionary *mutableDic = [NSMutableDictionary dictionaryWithDictionary:dictionary];
[mutableDic setValue:value forKey:key];
return mutableDic;
} else {
return dictionary;
}
}
- (NSDictionary *(^)(NSString *, id))append {
return ^id(NSString *key, id value) {
return _dictionaryWithValue(self, value, key);
};
}
需要運(yùn)用點(diǎn)調(diào)用的函數(shù),返回的類(lèi)型是block挂洛,且block有型參礼预,而該block返回的類(lèi)型是自身的類(lèi)NSDictionary,于是可以繼續(xù)調(diào)用下一次
這里有個(gè)小trick抹锄,為了使NSDictionary也支持添加元素逆瑞,會(huì)先轉(zhuǎn)型成NSMutableDictionary。