> Как проверить, что число положительное или отрицательное (iOS, Swift)
Уровень: middle · Роль: mobile · Категория: Технические вопросы
Компании: Meta
Стек: iOS, Swift
> Пример ответа
Короткий ответ
В Swift для проверки знака числа можно использовать сравнение с нулём: number > 0 для положительного, number < 0 для отрицательного, number == 0 для нуля. Для Int, Double, Float это работает напрямую. Также есть свойство sign у чисел с плавающей точкой (типа FloatingPointSign), но оно не различает ноль и отрицательное число - для нуля возвращает .plus. Для целых чисел sign отсутствует, поэтому сравнение - основной способ.
Подробное объяснение
Базовый подход - операторы сравнения. Для любого числового типа в Swift (Int, Double, Float, CGFloat и т.д.) можно написать:
SWIFTif number > 0 {// положительное} else if number < 0 {// отрицательное} else {// ноль}
Важный нюанс: для Double и Float существует понятие отрицательного нуля (-0.0). Сравнение -0.0 < 0 вернёт false, потому что -0.0 равен 0.0 по стандарту IEEE 754. Если нужно различить -0.0 и +0.0, используйте свойство sign:
SWIFTlet negativeZero = -0.0negativeZero.sign == .minus // true
Также есть функция signum() (доступна с Swift 5.0), которая возвращает -1, 0 или 1 в зависимости от знака числа. Для -0.0 она вернёт -1, что может быть неожиданно.
Для целых чисел signum() работает предсказуемо: (-5).signum() == -1, 0.signum() == 0, 7.signum() == 1.
На практике
В реальном коде чаще всего нужно просто ветвление через if или switch. Например, при обработке изменения цены, направления движения или разницы значений. Для CGFloat (часто используется в UI) подход тот же.
Если число может быть nil, сначала извлекаем значение через guard let или if let, затем проверяем знак.
Пример кода
SWIFTfunc describeSign(_ number: Double) -> String {if number > 0 {return "положительное"} else if number < 0 {return "отрицательное"} else {return "ноль"}}// Для целых чиселfunc checkInteger(_ value: Int) {switch value.signum() {case -1:print("отрицательное")case 1:print("положительное")default:print("ноль")}}// Учёт отрицательного нуляfunc isNegativeZero(_ value: Double) -> Bool {value == 0 && value.sign == .minus}
Как отвечать на собеседовании
Начните с простого сравнения с нулём, затем упомяните нюанс с -0.0 для чисел с плавающей точкой. Покажите, что знаете про signum() и свойство sign. Если спросят про производительность - сравнение и signum() работают за O(1), разницы нет. Хорошо добавить пример с guard let для опциональных значений.
Что проверяет интервьюер
Интервьюер оценивает:
- знание базовых операторов сравнения в Swift;
- понимание особенностей IEEE 754 (отрицательный ноль);
- умение выбрать подходящий инструмент для конкретного типа данных;
- аккуратность в edge cases (например,
Int.minпри переполнении, но здесь это не актуально).
Типичные ошибки
- Забывают про
-0.0и считают, что-0.0 < 0вернётtrue. - Используют
abs(number) > 0для проверки на ноль - это работает, но менее читаемо. - Пытаются вызвать
signуInt- этого свойства нет, только уFloatingPoint. - Путают
signum()иsign:signum()возвращает число,sign- enum.plus/.minus. - Не обрабатывают случай
nil, если число опциональное.
> Похожие задачи по mobile
Как сделать так, чтобы функция имела доступ к оригинальной структуре без копирования
Примеры случаев хранения значений на куче и как устроено выделение памяти для массивов
Как реализовать проверку на переполнение при конвертации строки в число
Как разделить функции для чтения и записи значений
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью