1

哪种结构更适合这种情况,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;
    }
}

另外,附带说明:为什么不允许开关表达式(在我的情况下为余数)为“双”类型?我必须将其转换为“int”才能编译。

4

4 回答 4

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;
}
于 2012-04-03T20:20:10.910 回答
3

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


示例代码

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

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(对于大写字母),您可以获得字符串形式的十六进制值。简单的


其他解决方案

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

如果您仅使用结果(数字或字符串)向用户显示,那么您的 NSNumbers 也可能会替换为 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"

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

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

根据您重构代码的方式,您可能应该将其重命名以更清楚地表达您的意图。

于 2012-04-03T20:17:56.713 回答
0

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

尽管 switch 看起来更好,但我相信删除 { } 的 if 语句更好。这样一来,每行只有一个语句,并且所有良好实践都得以保留。

于 2012-04-03T20:12:35.143 回答
0

这可能会有所帮助

- (id)hexEvaluator:(double)remainder
{
    return remainder <= 9 ? [NSNumber numberWithInt:(int)remainder] : [NSString stringWithFormat:@"%X", (int)remainder)]; 
}
于 2012-04-03T20:23:23.897 回答