哪种构造更适合这种情况,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'以便编译。
答案 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)];
}