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