> Как проверить, что число положительное или отрицательное (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 и т.д.) можно написать:

SWIFT
if 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:

SWIFT
let negativeZero = -0.0
negativeZero.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, затем проверяем знак.

Пример кода

SWIFT
func 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, если число опциональное.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью