用三元运算符替换If语句

时间:2014-06-23 12:53:15

标签: objective-c c if-statement operators ternary-operator

我正在试图弄清楚是否可以使用三元运算符用更简单的代码替换以下代码。

if ([self.pesoNota[@"nota"] floatValue] > 0.0) {
        suaNota = [nf stringFromNumber:[NSNumber numberWithFloat:[self.pesoNota[@"nota"] floatValue]]];
    }
    else {
        suaNota = @"ND";
    }
    if ([exercicio[@"notaComunidade"] floatValue] > 0.0) {
        notaComunidade = [nf stringFromNumber:[NSNumber numberWithFloat:[exercicio[@"notaComunidade"] floatValue]]];
    }
    else {
        notaComunidade = @"ND";
    }

    self.notaLabel.text = [NSString stringWithFormat:@"%@ / %@", suaNota, notaComunidade];

这样的事情:

self.notaLabel.text = [NSString stringWithFormat:@"%@ / %@", [nf stringFromNumber:[NSNumber numberWithFloat:[self.pesoNota[@"nota"] floatValue]]] ? : @"ND", [nf stringFromNumber:[NSNumber numberWithFloat:[exercicio[@"notaComunidade"] floatValue]]] ? : @"ND"];

第二个代码没有给我预期的结果,如果第一个表达式为false,它返回0,我希望它返回一个字符串。

无论如何,我认为没有可能减少这个代码,但无论如何,它值得一试,因为我经常使用它。

2 个答案:

答案 0 :(得分:1)

首先,如果你经常使用这个代码,你应该专门使用一个小帮助函数。第二件事,你的例子是缺少条件,语义与你想要的结果完全不同:

self.notaLabel.text = 
[NSString stringWithFormat:@"%@ / %@", 
    [nf stringFromNumber:
        [NSNumber numberWithFloat:[self.pesoNota[@"nota"] floatValue]]] ? 
        /* missing condition */ :
        @"ND", 

    [nf stringFromNumber:
        [NSNumber numberWithFloat:[exercicio[@"notaComunidade"] floatValue]]] ? 
        /* missing condition */ :
        @"ND"
];

应该是这样的:

self.notaLabel.text = 
[NSString stringWithFormat:@"%@ / %@",
  [self.pesoNota[@"nota"] floatValue] > 0.0 ? // condition 
     [nf stringFromNumber:[NSNumber numberWithFloat:[self.pesoNota[@"nota"] floatValue]]] // true case
     : @"ND" // false case
  ,
  [exercicio[@"notaComunidade"] floatValue] > 0.0 ? // condition
     [nf stringFromNumber:[NSNumber numberWithFloat:[exercicio[@"notaComunidade"] floatValue]]] // true case
     : @"ND" // false case
];

在任何情况下都是不可读的。我的意思是,你可以正确地声明局部变量以避免混乱的代码:

NSNumber* notaValue = self.pesoNota[@"nota"];
NSNumber* notaComunidade = exercicio[@"notaComunidade"];

self.notaLabel.text = [NSString stringWithFormat:@"%@ / %@",
  [notaValue floatValue] > 0 ? [nf stringFromNumber:notaValue] : @"ND",
  [notaComunidade floatValue] > 0 ? [nf strungFromNumber:notacomunidadate] : @"ND"
];

答案 1 :(得分:1)

您的代码包含可以提取到其他方法的重复项:

- (NSString *)floatStringOrNDForNumber:(NSNumber *)number numberFormatter:(NSNumberFormatter *)numberFormatter {
    return ([number floatValue] > 0.0f) ? [numberFormatter stringFromNumber:number] : @"ND";
}

然后你有一个非常干净,可以理解的几行代码:

suaNota = [self floatStringOrNDForNumber:self.pesoNota[@"nota"] numberFormatter:nf];
notaComunidade = [self floatStringOrNDForNumber:exercicio[@"notaComunidade"] numberFormatter:nf];
self.notaLabel.text = [NSString stringWithFormat:@"%@ / %@", suaNota, notaComunidade];