咱們開發過程中不少時候會對一個對象的屬性屢次設置參數,好比設置一個UILable和UIButton時候,會屢次使用點語法setter和getter屬性,步驟繁瑣,因而我就想起了SDAutoLayout和Masonry當中使用的鏈式編程結構,並且如今不少的比較成熟的第三方框架也愈來愈多的使用這種開發方式。ios
這種編程方式最大的優勢就是一次開發,後面使用都是迅速調用,省去繁瑣的屢次調用點語法,但也有缺點,初次開發代碼量較大,語法複雜。可是對於經常使用的一些類來講基本是一次開發終生受益。git
經過上面兩個例子,咱們嘗試推測一下大概的結構:github
- (MASConstraint * (^)(CGFloat))offset {
return ^id(CGFloat offset){
self.offset = offset;
return self;
};
}複製代碼
typedef SDAutoLayoutModel *(^MarginToView)(id viewOrViewsArray, CGFloat value);//getter方法的返回值
- (MarginToView)leftSpaceToView
{
if (!_leftSpaceToView) {
_leftSpaceToView = [self marginToViewblockWithKey:@"left"];
}
return _leftSpaceToView;
}
- (MarginToView)marginToViewblockWithKey:(NSString *)key
{
__weak typeof(self) weakSelf = self;
return ^(id viewOrViewsArray, CGFloat value) {
SDAutoLayoutModelItem *item = [SDAutoLayoutModelItem new];
item.value = @(value);
if ([viewOrViewsArray isKindOfClass:[UIView class]]) {
item.refView = viewOrViewsArray;
} else if ([viewOrViewsArray isKindOfClass:[NSArray class]]) {
item.refViewsArray = [viewOrViewsArray copy];
}
[weakSelf setValue:item forKey:key];
return weakSelf;
};
}複製代碼
經過以上咱們能夠看出,基本和咱們以前推測的是同樣的:使用點語法、運用Block回調、返回值是調用的實例對象。編程
以Masonry的方法作例子bash
- (MASConstraint * (^)(CGFloat))offset {
return ^id(CGFloat offset){
self.offset = offset;
return self;
};
}複製代碼
以上方法能夠看作做爲一個getter方法,由於在咱們使用點語法的過程中,這個方法必須是有返回參數,可是無傳入參數,因此這個方法正好能夠看作是offset這個屬性的getter方法來使用,也就是說能夠直接用點語法來調用。框架
應該會有人來發問,offset的參數是怎麼傳進來的?
.offset(5)當中,(5)是整個Block的參數,而且也是做爲Block的參數傳出去,由於BLock的返回值參數用於從外向內返回參數傳遞結果,這就是爲何咱們從外面傳入參數,在內部會獲得參數數值的緣由。ui
返回的參數是一個Block,MASConstraint是Block返回值的類型,CGFloat是Block返回參數的類型。以上都是Block的基礎用法,要是看的不是很明白,能夠看一下我下面的參考文件。spa
我以爲使用場景其實不少,看我的需求了,可是我總結的不外乎如下幾點:code
可是以上總結起來,其實就是須要對一個對象進行連續且重複操做的是時候須要使用鏈式編程的語法。cdn