> Нужно ли проверять продукт или ошибку в методе loadData, если результат уже обработан (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Ozon

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Да, проверять нужно, даже если результат уже обработан. В loadData важно различать два уровня: получение данных и их обработку. Проверка ошибки на этапе загрузки обязательна, потому что обработка результата не гарантирует, что данные вообще были получены. Если не проверить ошибку, вы рискуете обработать nil или некорректное состояние, что приведёт к падению или некорректному UI. Проверка ошибки - это защита от неопределённого состояния, а не дублирование обработки.

Подробное объяснение

Вопрос сводится к разделению ответственности между слоями. loadData обычно выполняет сетевой запрос или чтение из хранилища. Результат может быть трёх видов: успешные данные, ошибка, или отсутствие данных (например, nil). Если вы обрабатываете результат (например, маппите в модель), это не означает, что ошибка исчезла - она просто осталась необработанной.

Проверка ошибки в loadData нужна по нескольким причинам:

  1. Предотвращение неопределённого состояния - если загрузка упала, а вы продолжили обработку, вы получите мусорные данные или nil, который потом вызовет force unwrap или некорректное поведение.
  2. Правильная семантика - метод, который называется loadData, должен гарантировать, что либо данные загружены, либо ошибка явно проброшена. Иначе вызывающий код не может доверять результату.
  3. Отладка и логирование - ошибка на этапе загрузки часто содержит важную информацию (статус код, сообщение сервера), которую нельзя потерять при обработке.
  4. Разделение слоёв - обработка результата (например, преобразование JSON в модель) - это отдельная задача. Если она упадёт, это будет ошибка обработки, а не загрузки. Смешивать их - плохая практика.

Типичный паттерн - использовать Result<Data, Error> или async throws. Тогда проверка ошибки становится явной и обязательной.

На практике

На практике это выглядит так: в loadData вы проверяете ошибку сразу после получения сырых данных, до любой обработки. Если ошибка есть - пробрасываете её наверх или возвращаете Result.failure. Если ошибки нет - передаёте данные дальше в обработчик.

Пример из жизни: если вы загружаете список пользователей, а сервер вернул 500, вы не должны пытаться парсить тело ответа. Вы должны вернуть ошибку с кодом 500. Только после успешного получения данных можно делать маппинг в [User].

Если вы обработали результат и получили пустой массив - это не ошибка загрузки, это валидный результат. Но если загрузка упала - пустой массив будет ложным состоянием, и UI покажет "нет данных" вместо ошибки.

Пример кода

SWIFT
func loadData() async throws -> [User] {
// 1. Получаем сырые данные
let data: Data
do {
data = try await networkService.fetch()
} catch {
// 2. Проверяем ошибку ДО обработки
throw NetworkError.requestFailed(error)
}
// 3. Только после успешной загрузки обрабатываем
do {
let users = try JSONDecoder().decode([User].self, from: data)
return users
} catch {
throw NetworkError.decodingFailed(error)
}
}

Здесь ошибка загрузки проверяется явно, и только потом данные обрабатываются. Если бы мы не проверили ошибку на шаге 2, мы бы попытались декодировать мусорные данные.

Как отвечать на собеседовании

Начните с прямого ответа: "Да, проверять нужно". Затем объясните разницу между ошибкой загрузки и ошибкой обработки. Приведите пример, где отсутствие проверки приводит к некорректному состоянию. Упомяните Result или async throws как правильный способ обработки. Подчеркните, что проверка ошибки - это не дублирование, а защита от неопределённого состояния. Если спросят про nil - скажите, что nil тоже нужно обрабатывать явно, но это отдельный кейс.

Что проверяет интервьюер

Интервьюер проверяет:

  • Понимание разделения ответственности между слоями.
  • Умение работать с ошибками в Swift (throws, Result, do-catch).
  • Осознание рисков необработанных ошибок.
  • Способность объяснить trade-off между ранней и поздней проверкой.
  • Понимание, что обработка результата не заменяет проверку ошибки.

Типичные ошибки

  • "Результат уже обработан, значит ошибка не нужна" - это главная ошибка, показывает непонимание потока данных.
  • Смешивание ошибки загрузки и ошибки декодирования в один catch - теряется контекст.
  • Использование try? без проверки nil - приводит к молчаливому проглатыванию ошибок.
  • Проверка ошибки после обработки данных - например, попытка декодировать, а потом проверять, не пустой ли массив. Это не заменяет проверку ошибки загрузки.
  • Отсутствие проброса ошибки наверх - метод возвращает [] при ошибке, что ломает логику UI.

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

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