> Нужно ли проверять продукт или ошибку в методе loadData, если результат уже обработан (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Ozon
Стек: iOS, Swift
> Пример ответа
Короткий ответ
Да, проверять нужно, даже если результат уже обработан. В loadData важно различать два уровня: получение данных и их обработку. Проверка ошибки на этапе загрузки обязательна, потому что обработка результата не гарантирует, что данные вообще были получены. Если не проверить ошибку, вы рискуете обработать nil или некорректное состояние, что приведёт к падению или некорректному UI. Проверка ошибки - это защита от неопределённого состояния, а не дублирование обработки.
Подробное объяснение
Вопрос сводится к разделению ответственности между слоями. loadData обычно выполняет сетевой запрос или чтение из хранилища. Результат может быть трёх видов: успешные данные, ошибка, или отсутствие данных (например, nil). Если вы обрабатываете результат (например, маппите в модель), это не означает, что ошибка исчезла - она просто осталась необработанной.
Проверка ошибки в loadData нужна по нескольким причинам:
- Предотвращение неопределённого состояния - если загрузка упала, а вы продолжили обработку, вы получите мусорные данные или
nil, который потом вызоветforce unwrapили некорректное поведение. - Правильная семантика - метод, который называется
loadData, должен гарантировать, что либо данные загружены, либо ошибка явно проброшена. Иначе вызывающий код не может доверять результату. - Отладка и логирование - ошибка на этапе загрузки часто содержит важную информацию (статус код, сообщение сервера), которую нельзя потерять при обработке.
- Разделение слоёв - обработка результата (например, преобразование JSON в модель) - это отдельная задача. Если она упадёт, это будет ошибка обработки, а не загрузки. Смешивать их - плохая практика.
Типичный паттерн - использовать Result<Data, Error> или async throws. Тогда проверка ошибки становится явной и обязательной.
На практике
На практике это выглядит так: в loadData вы проверяете ошибку сразу после получения сырых данных, до любой обработки. Если ошибка есть - пробрасываете её наверх или возвращаете Result.failure. Если ошибки нет - передаёте данные дальше в обработчик.
Пример из жизни: если вы загружаете список пользователей, а сервер вернул 500, вы не должны пытаться парсить тело ответа. Вы должны вернуть ошибку с кодом 500. Только после успешного получения данных можно делать маппинг в [User].
Если вы обработали результат и получили пустой массив - это не ошибка загрузки, это валидный результат. Но если загрузка упала - пустой массив будет ложным состоянием, и UI покажет "нет данных" вместо ошибки.
Пример кода
SWIFTfunc loadData() async throws -> [User] {// 1. Получаем сырые данныеlet data: Datado {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.
> Похожие задачи по mobile
Какую ссылку лучше делать слабой в цикле сильных ссылок и почему
Пробовали ли верстать под iPad и iPhone одновременно
Где должна происходить обработка ошибок: в сервисе или в UI
Какой метод UITableView используется для dequeue ячейки
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью