iOS的枚舉NS_ENUM
,對于我們開發(fā)人員來說,再熟悉不過了,下面來說說幾種不同的寫法.
比如,我們有一個菜單類型的枚舉
,根據(jù)菜單類型的不同,處理的事情也不一樣.
/**
菜單類型
*/
typedef NS_ENUM(NSInteger, XXMenuType) {
XXMenuTypeA = 0,
XXMenuTypeB,
XXMenuTypeC,
};
@property (nonatomic, assign) XXMenuType currentType;
一懒构、枚舉 + if else
比較常見的通過if else
做條件匹配的寫法
if(_currentType == XXMenuTypeA){
}else if (_currentType == XXMenuTypeB){
}else if (_currentType == XXMenuTypeC){
}
但是當開發(fā)的后期,枚舉增加了新的類型XXMenuTypeD
,如果沒有再進行else if
那邏輯判斷就出現(xiàn)了遺漏.或者說最后判斷使用的是else
,那就將多種類型都歸入了else
邏輯分支,這是我們不希望發(fā)生的.
二、與switch case配套使用
當枚舉和switch case
搭配使用時,不要寫default
.
switch (_currentType) {
case XXMenuTypeA:
//logic A
break;
case XXMenuTypeB:
//logic B
break;
case XXMenuTypeC:
//logic C
break;
}
這是如果新增了XXMenuTypeD
,Xcode會通過warning
的方式顯示的提醒我們還有類型沒有處理,要我們加上case
.
switch case
比起if else
更一目了然.
三扩氢、巧妙搭配Block
借助Block + Switch Case + function
封裝一個使用
//.h文件中
typedef void (^menuTypeBlock) (void);
- (void)matchMenuTypeA:(menuTypeBlock)blockA menuTypeB:(menuTypeBlock)blockB menuTypeC:(menuTypeBlock)blockC;
//.m文件
- (void)matchMenuTypeA:(menuTypeBlock)blockA menuTypeB:(menuTypeBlock)blockB menuTypeC:(menuTypeBlock)blockC{
switch (_currentType) {
case XXMenuTypeA:
!blockA ? :blockA();
break;
case XXMenuTypeB:
!blockB ? :blockB();
break;
case XXMenuTypeC:
!blockC ? :blockC();
break;
}
}
//調(diào)用方
[obj matchMenuTypeA:^{
//code
} menuTypeB:^{
//code
} menuTypeC:nil];
僅有一處使用時這樣寫代碼,會覺得有點繁瑣,增加了代碼量卻沒有太大的用處.
但當有多處使用,在增加了一種枚舉類型時,只要我們修改了這個方法名,那么外部使用到該function
的位置Xcode都會顯示為紅色的error
錯誤.
這樣一來就再也不會出現(xiàn)該枚舉的邏輯遺漏了,甚至有點函數(shù)式編程內(nèi)味兒了? 畢竟command + B
爆紅的 error
比warning
更讓程序員操心:(