【问题标题】:Which construct is better suited for this situation, an if-else or a switch?哪种结构更适合这种情况,if-else 还是 switch?
【发布时间】:2012-04-03 20:09:03
【问题描述】:

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

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

【问题讨论】:

  • 因为这是 switch 语句所期望的——一个 int。

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


【解决方案1】:

绝对是一个 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;
}

【讨论】:

【解决方案2】:

简而言之: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

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

【讨论】:

    【解决方案3】:

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

    虽然 switch 看起来更好,但我相信删除 { } 的 if 语句更好。这样一来,每行只有一个语句,并且所有良好实践都得到了维护。

    【讨论】:

    • 然而,其他人可能不得不谈论由 if 语句与 switch 引起的多重检查引起的负载。 (不知道案例是索引还是迭代)
    【解决方案4】:

    这可能会有所帮助

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

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2016-01-06
      • 2023-03-10
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多