Objective-C正确使用If / Else

时间:2012-08-22 13:16:51

标签: objective-c if-statement performance

亲爱的互联网长老,

我正在尝试处理一系列字典,不同的数据集需要不同的处理,每个数据集都需要处理创建,更新和删除操作。很简单,我正在寻找一种更有效/更聪明的方法......

- (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"]) {


    }

}

}

1 个答案:

答案 0 :(得分: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
}

如果需要,也可以通过在selector-caller方法(processUpdates)中检查类型一次,将if else简化为switch case。例如:

在顶部的.m文件中

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]];

然后,您将为selectored方法提供typeVal而不是type,而方法本身也会这样做。

- (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
    }
}

希望能给你一些想法。