在 OC
中語法糖應用形式一般如下:
self.bgView = ({
UIView *view = [[UIView alloc] init];
view.layer.cornerRadius = 5;
view.layer.masksToBounds = YES;
view.backgroundColor = self.layout.searchBGColor;
[self addSubview:view];
view;
});
複製程式碼
這裡語法糖的使用有利於把程式碼集中便於閱讀;
通過對上面語法糖的觀察我們可以得出在 ({})
中,只需要在 {}
的最後一行返回一個 value
即可(我們是不是應該認為 ({})
的本質是一個 表示式 ),那麼我們就可以做一些有意思的事情了:
-
基本資料型別中使用
({})
,如下module.totalHeight = ({ 128.0; }); 複製程式碼
-
三目運算子中
例如在
-tableView:heightForRowAtIndexPath:
中我們使用model
進行快取cell
高度時一般情況程式碼會這樣:- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { APNTaskListModel *module = _data[indexPath.row]; if (module.totalHeight < 1.0) { module.totalHeight = [APNTaskListCell defaultHeight] + [APNTaskListCell increasedHeightWithName:module.apnTaskName]; } return module.totalHeight; } 複製程式碼
有了
({})
後你可以使用三目運算子來省略if
判斷,如下- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { APNTaskListModel *module = _data[indexPath.row]; return module.totalHeight > 1.0 ? module.totalHeight : ({ module.totalHeight = [APNTaskListCell defaultHeight] + [APNTaskListCell increasedHeightWithName:module.apnTaskName]; module.totalHeight; }); } 複製程式碼
再來一個?
model.showRightArrow ? ({ // 這裡也可以封裝為函式 self.rightArrowImgView.hidden = NO; self.rightArrowImgView.image = model.rightArrowIcon; self.spaceForDetail.constant = 33; }) : ({ self.rightArrowImgView.hidden = YES; self.spaceForDetail.constant = 15; }); 複製程式碼
emmm... 下一個.
-
在自定義巨集函式中的使用:
一般我們會在專案中自定義一些巨集,在區分
debug
模式和release
模式,如下一個簡單的例子:#ifdef DEBUG #define DR_SimpleLog(...) NSLog(__VA_ARGS__) #else #define DR_SimpleLog(...) #endif 複製程式碼
當我們在使用時可能會碰到一種情況,我想要在
debug
模式下看到某個計算方法被呼叫的次數時,可能會出現如下程式碼:static NSInteger i = 0; DR_SimpleLog(@"計算了:%@次",@(++i)); 複製程式碼
但是這個
static
變數i
,我們不想讓它在release
模式下存在,so:DR_SimpleLog(@"計算了:%@次",({ static NSInteger i = 0; @(++i); })); 複製程式碼