哪种结构更适合这种情况,if-else或switch?

时间:2012-04-03 20:09:04

标签: iphone objective-c xcode if-statement switch-statement

哪种构造更适合这种情况,if-else或switch?

- (id)hexEvaluator:(double)remainder
{
    if(remainder == 0) {return [NSNumber numberWithInt:0];}
    else if(remainder == 1) {return [NSNumber numberWithInt:1];}
    else if(remainder == 2) {return [NSNumber numberWithInt:2];}
    else if(remainder == 3) {return [NSNumber numberWithInt:3];}
    else if(remainder == 4) {return [NSNumber numberWithInt:4];}
    else if(remainder == 5) {return [NSNumber numberWithInt:5];}
    else if(remainder == 6) {return [NSNumber numberWithInt:6];}
    else if(remainder == 7) {return [NSNumber numberWithInt:7];}
    else if(remainder == 8) {return [NSNumber numberWithInt:8];}
    else if(remainder == 9) {return [NSNumber numberWithInt:9];}
    else if(remainder == 10) {return @"A";}
    else if(remainder == 11) {return @"B";}
    else if(remainder == 12) {return @"C";}
    else if(remainder == 13) {return @"D";}
    else if(remainder == 14) {return @"E";}
    else if(remainder == 15) {return @"F";}
    else return nil;

    switch ((int)remainder) 
    {
        case 0:  return [NSNumber numberWithInt:0]; break;
        case 1:  return [NSNumber numberWithInt:1]; break;
        case 2:  return [NSNumber numberWithInt:2]; break;
        case 3:  return [NSNumber numberWithInt:3]; break;
        case 4:  return [NSNumber numberWithInt:4]; break;
        case 5:  return [NSNumber numberWithInt:5]; break;
        case 6:  return [NSNumber numberWithInt:6]; break;
        case 7:  return [NSNumber numberWithInt:7]; break;
        case 8:  return [NSNumber numberWithInt:8]; break;
        case 9:  return [NSNumber numberWithInt:9]; break;
        case 10: return @"A";; break;
        case 11: return @"B";; break;
        case 12: return @"C";; break;
        case 13: return @"D";; break;
        case 14: return @"E";; break;
        case 15: return @"F";; break;

        default: return nil; break;
    }
}

另外,旁注:为什么切换表达式(在我的情况下为余数)不允许是'double'类型?我不得不将它转换为'int'以便编译。

4 个答案:

答案 0 :(得分:5)

绝对是一个if语句。我会摆脱所有额外的界限:

- (id)hexEvaluator:(double)remainder
{
    if (remainder < 10)
    {
        return [NSNumber numberWithInt:(int)remainder];
    }
    else if (remainder < 16)
    {
        return [NSString stringWithFormat:@"%X", (int)remainder)];
    }
    return nil;
}

答案 1 :(得分:3)

简而言之: if-statement更适合这种情况,因为它提供了更复杂的条件。


示例代码

在您的情况下,示例代码可以替换您的方法的功能:

if (remainder < 10 ) {
    return [NSNumber numberWithInt:(int)reminder]; 
} else if (remainder < 16) {
    // Will return: "A", "B", "C", "D", "E" or "F"
    return [NSString stringWithFormat:@"%X", (int)remainder];
} else {
    return nil;
}

还有其他方法可以将基数10 int转换为十六进制值,并使用%x(对于小写字母)或%X(对于大字母),您可以将十六进制值作为串。简单


其他解决方案

根据您使用计算结果的方式,您可以重构并制作更好的代码。

如果您只使用结果(数字或字符串)显示给用户,那么您的NSNumber也可能被NSStrings替换,并且可以删除第一个if语句:

if (remainder < 16) {
    // Will return: "1", "2", "3", "4", ...,  "A", "B", "C", "D", "E" or "F"
    return [NSString stringWithFormat:@"%X", (int)remainder]; 
} else {
    return nil;
}

另一方面,如果您使用的结果进行了一些计算,那么您应该使用更容易比较的数据类型(如何将[NSNumber numberWithInt:9]@"A"进行比较?)< / p>

也许直接在代码中使用十六进制值:

int hex = 0xC;
NSLog(@"hex = %X", hex); // Output: hex = C
NSLog(@"int = %d", hex); // Output: hex = 12

这使得比较变得更容易:

NSLog(@"%@ than 9", (hex > 0x9 ? @"bigger" : @"smaller")); // bigger than 9
NSLog(@"%@ than F", (hex > 0xF ? @"bigger" : @"smaller")); // smaller than F

根据您重构代码的方式,您应该将其重命名为更明确地表达您的意图。

答案 2 :(得分:0)

它不能是双重的,因为你的案例用int标记,并且它的类型不匹配。

虽然开关看起来更好但我相信删除了{}的if语句更好。这样,每行只有一个语句,并保持所有良好实践。

答案 3 :(得分:0)

这可能会有所帮助

- (id)hexEvaluator:(double)remainder
{
    return remainder <= 9 ? [NSNumber numberWithInt:(int)remainder] : [NSString stringWithFormat:@"%X", (int)remainder)]; 
}