2012-08-22 20 views
2

互聯網的尊敬長輩,Objective-C的正確使用的if/else

我試圖處理一系列詞典,不同的數據集將需要不同的處理,並且每個數據集需要處理創建,更新和刪除操作。很簡單,我在尋找這樣做的更有效的/聰明的辦法...

- (NSDictionary*)processUpdatesForDataSet:(NSString*)dataSet ofType:(NSString*)type { 


if ([dataSet isEqualToString:@"countries"]) { 

    if ([type isEqualToString:@"CREATE"]) { 


    } else if ([type isEqualToString:@"UPDATE"]) { 


    } else if ([type isEqualToString:@"DELETE"]) { 


    } 

} else if ([dataSet isEqualToString:@"connections"]) { 

    if ([type isEqualToString:@"CREATE"]) { 


    } else if ([type isEqualToString:@"UPDATE"]) { 


    } else if ([type isEqualToString:@"DELETE"]) { 


    } 

} else if ([dataSet isEqualToString:@"sites"]) { 

    if ([type isEqualToString:@"CREATE"]) { 


    } else if ([type isEqualToString:@"UPDATE"]) { 


    } else if ([type isEqualToString:@"DELETE"]) { 


    } 

} 

} 
+0

是否每個dataSet類型的創建,更新和刪除代碼都不同?如果是這樣,你可能想看看你的數據模型。如果沒有,你可能想看看每種類型的公共處理程序,而不是每個數據集。 – Kalle

+0

這實際上並不是插入代碼,這是在此之前的一個步驟,但是對於每個dataSet類型,進程都會有所不同。不幸的是,我用來提取這些數據的API不會以數據模型的正確格式返回,所以我需要將其轉換。數據模型無法更改:( – Sammio2

+0

...如果這是您的目標(和您的問題),我必須告訴您所提供的「if ... else」語句是正確的。我可以製作更復雜的動態解決方案類似的問題與'NSDictionary'對象和'塊',但我不太確定現在是否有必要。 – holex

回答

3

這是一個相當特殊的情況,我相信有些人會認爲這種做法是有點走火入魔,但你有它。

有兩種選擇。一個是設置塊來處理數據集。缺點是你必須保留這些塊在一些字典或類似的。我不打算進入這種方法。另一種方法是根據數據集生成選擇器並檢查並調用該方法。

在processUpdates方法,你將不得不

NSString *dataSelString = [NSString stringWithFormat:@"dataSet_%@:", dataSet]; 
SEL dataSel = NSStringFromSelector(dataSelString); 
if ([self respondsToSelector:dataSel)] { 
    [self performSelector:dataSel withObject:type]; 
} else { 
    NSLog(@"warning: unknown dataSet: %@", dataSet); 
    // deal with unknown data set, e.g. alerting user or such 
} 

對於每一個數據集類型,那麼你將不得不在self的方法,例如

- (void)dataSet_countries:(NSString *)type 
{ 
    // handle each type accordingly 
} 

你可以精簡的if else到交換機情況下,如果你想,在選擇來電顯示法(processUpdates)一次檢查的類型。例如:

在頂部

typedef enum { 
    DataTypeInsert = 0, 
    DataTypeUpdate = 1, 
    DataTypeDelete = 2, 
    DataTypeUnknown = NSNotFound 
} DataType; 
static NSArray *typeValues = nil; 

// in processUpdates method 
if (typeValues == nil) { 
    // we set up typeValues once 
    typeValues = [[NSArray alloc] initWithObjects:@"INSERT", @"UPDATE", @"DELETE", nil]; 
} 
// since 'unknown' is NSNotFound, this will work out fine always 
NSNumber *typeVal = [NSNumber numberWithInt:[typeValues indexOfObject:type]]; 

這樣,你會提供typeVal,而不是類型的selectored方法和方法本身就如做周圍的.m文件

- (void)dataSet_countries:(NSNumber *)type 
{ 
    DataType dataType = [type intValue]; 
    switch (dataType) { 
    case DataTypeInsert: 
     break; 
    // ... 
    case DataTypeUnknown: 
     // alert user or such that the type was invalid 
    } 
} 

希望能給你一些想法。

+0

感謝這個,我實際上實現了一個以前使用模塊的方法......但是代碼似乎變得越來越難以閱讀了!這個方法並且一定要把它標記爲當我完成時回答! – Sammio2

+0

我的關於使用字典映射字符串到塊的第一個想法的評論是不這樣做的。基本上,這正是Objective-C的方法調度確實,但它使用高度優化的馬赫ine代碼。你的第二個解決方案會更快。 – JeremyP