Как проверить, что число положительное или отрицательное
Что проверяют
Вопрос разминочный, поэтому смотрят не на сам if, а на детали: помните ли вы про ноль, про Double с NaN и про идиоматичные средства Swift. Следом нередко просят сделать то же для любого числового типа через дженерики.
Как отвечать
Базовый ответ: сравнение с нулём и три исхода, положительное, отрицательное, ноль. В Swift удобно писать через switch с диапазонами, чтобы все случаи были видны сразу:
enum Sign { case positive, negative, zero }
func sign(of n: Int) -> Sign {
switch n {
case ..<0: return .negative
case 0: return .zero
default: return .positive
}
}Дальше покажите, что знаете стандартную библиотеку:
signum(): у целых типов (BinaryInteger) возвращает-1,0или1;signуFloatingPoint: возвращает.plusили.minusпо знаковому биту, поэтому для-0.0получится.minus, хотя-0.0 < 0ложно;isNaN: уDouble.nanлюбое сравнение ложно, и цепочкаif/else if/elseмолча отправит его в ветку «ноль». ПроверяйтеisNaNпервым;- дженерик:
func sign<T: Comparable & SignedNumeric>(of n: T)со сравнением с.zeroподходит и дляInt, и дляDouble, и дляDecimal.
Если нужен текст для пользователя, отделите вычисление от форматирования: функция возвращает enum, строку собирает слой отображения. Так логику проще покрыть тестами в XCTest или Swift Testing.
Где спотыкаются
Забывают про ноль: пишут if n > 0 { ... } else { ... } и записывают ноль в отрицательные.
Не думают про Double: NaN проскакивает в «ноль», а -0.0 при сравнении равен нулю, хотя знак у него минус. Для значений из JSON или вычислений это реальный сценарий.
Добавляют лишнее: import Foundation ради одного сравнения не нужен, операторы есть в стандартной библиотеке Swift. Второй перекос: возвращают готовую строку «Число положительное» вместо типа, и результат уже не переиспользовать.