Заменить оператор If на троичный оператор

#objective-c #c #if-statement #operators #ternary-operator

#objective-c #c #if-оператор #операторы #тернарный оператор

Вопрос:

Я пытаюсь выяснить, возможно ли заменить следующий код более простым кодом, используя троичный оператор.

 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"];
 

Второй код не дает мне ожидаемого результата, он возвращает 0 в случае, если первое выражение равно false, я хочу, чтобы оно возвращало строку.

В любом случае, я не думаю, что можно сократить этот код, но в любом случае стоит попробовать, поскольку я часто этим пользуюсь.

Комментарии:

1. «поскольку я часто использую это» — так почему бы вам не поместить его в собственную функцию / метод?

2. Меньше строк! = проще…

3. Что ж, спасибо, это, конечно, вариант, но вопрос более концептуальный, я просто хочу знать, возможно ли сократить этот код. И для меня меньше строк == проще. 🙂

4. Я не включил это в свой ответ, потому что это было не совсем то, о чем вы спрашивали, но у вас есть этот фрагмент кода, который действительно не нужен: [NSNumber numberWithFloat:[self.pesoNota[@»nota»] floatValue]] . Вы можете просто использовать: self.pesoNota[@»nota»], поскольку это уже NSNumber .

Ответ №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. Именно то, что я искал. Спасибо.

Ответ №2:

Ваш код содержит дублирование, которое вы могли бы извлечь в другой метод:

 - (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];