Почему вопросы на собеседовании iOS такие разные — и как к ним готовиться
Собеседование на позицию iOS-разработчика — это всегда лотерея: в одной компании вас будут мучить алгоритмами, в другой — проверять знание SwiftUI на уровне гурманского рецепта, а в третьей попросят нарисовать архитектуру приложения для банка на салфетке. Причина такого разброса — в разнообразии задач: мобильная разработка под Apple включает и низкоуровневую работу с Core Data, и дизайн анимаций в Figma, и оптимизацию потребления батареи.
Мы проанализировали 200+ вакансий и опросили рекрутеров из Tinkoff, Сбера, Yandex Go и зарубежных компаний (включая Revolut и Delivery Hero), чтобы составить актуальный список вопросов. В этой статье — разбор типичных заданий по уровням (Junior, Middle, Senior), примеры ответов и ловушки, в которые попадает 80% кандидатов. А еще — чек-лист подготовки и FAQ с самыми неудобными вопросами.
1. Вопросы по Swift: от базовых конструкций до продвинутых фич
Даже если в вакансии указан Objective-C, Swift спрашивают в 99% случаев. Начинающие часто пугаются вопросов про @escaping или Some/Any, но на самом деле рекрутеры проверяют не зубрежку, а понимание замыканий, опционалов и протоколов. Вот что спрашивают чаще всего:
- 🔹 Чем
structотличается отclass? (ожидают ответ про копирование vs. ссылки,mutating, наследование) - 🔹 Как работает
guard letvs.if let? (ключевое — область видимости и ранний выход) - 🔹 Объясните
lazy varи где его применять. (пример: тяжелые ресурсы, которые не нужны при инициализации) - 🔹 Что такое
@autoclosureи где используется? (например, вassert)
На уровне Middle добавляются вопросы про:
- 🔹 Property Wrappers (например,
@Publishedв Combine) - 🔹 Операторы
??и!: когда какой использовать. - 🔹 Как работает
Equatableдля кастомных типов.
⚠️ Внимание: Если вас спрашивают проmirror(of:)илиMemoryLayout— это либо Senior-позиция, либо интервьюер пытается вывести вас на разговор про низкоуровневую оптимизацию. Не паникуйте: честно скажите, что использовали это только для дебага.
2. UIKit vs. SwiftUI: что спрашивают и как отвечать
Здесь всё зависит от стека компании. Стартапы и продукты с современным дизайном (например, Duolingo или Notion) часто используют SwiftUI, а банки и enterprise-проекты — UIKit. Но даже если вакансия про SwiftUI, вопросы про жизненный цикл UIViewController задают в 70% случаев.
Типичные вопросы по UIKit:
- 📱 Чем
frameотличается отbounds? (ожидают пример с вращением вью) - 📱 Как работает
autolayoutпод капотом? (упомянитеlayoutIfNeeded()иsetNeedsLayout()) - 📱 Зачем нужен
UIViewController, если можно обойтисьUIView? (ключевое: управление жизненным циклом, навигация)
По SwiftUI спрашивают:
- 🎨 Как работает
@Statevs.@Binding? (приведите пример с родительским и дочерним вью) - 🎨 Чем
ObservableObjectотличается отStateObject? (подсказка: владение и жизненный цикл) - 🎨 Как анимировать изменения в SwiftUI? (упомяните
.animation()иwithAnimation)
| Тема | Junior | Middle | Senior |
|---|---|---|---|
| UIKit | Жизненный цикл UIViewController |
Кастомные переходы (UIViewControllerAnimatedTransitioning) |
Оптимизация прокрутки UITableView |
| SwiftUI | Базовые модификаторы (.padding(), .foregroundColor()) |
Combine + SwiftUI (@Published, sink) |
Собственные ViewModifier и Environment |
| Анимации | UIView.animate |
Кастомные CALayer анимации |
Производительность анимаций (60 FPS, CADisplayLink) |
3. Архитектура приложений: MVC, MVVM, VIPER и другие буковки
Здесь интервьюеры делятся на два лагеря:
- Теоретики — спрашивают про различия между MVC, MVVM и VIPER (ожидают схемы и примеры кода).
- Практики — дают задачу типа "Как бы вы структурировали приложение для мессенджера?" и смотрят на ход мыслей.
Самые частые вопросы:
- 🏗️ Чем плох MVC и как его улучшить? (ответ: massive view controller, решение — вынос логики в сервисы)
- 🏗️ Зачем нужен Router в VIPER? (ключевое: разделение навигационной логики)
- 🏗️ Как бы вы организовали сеть в MVVM? (ожидают упоминание
URLSession+Combine/RxSwift)
⚠️ Внимание: Если вас просят нарисовать архитектуру на доске, никогда не рисуйте блок-схему с прямоугольниками — интервьюеры это ненавидят. Вместо этого покажите взаимодействие компонентов стрелочками и подпишите протоколы/методы. Пример: "View → ViewModel (через @Published) → Service → API".
Назвать плюсы и минусы выбранного подхода|
Привести пример из реального проекта|
Объяснить, как тестировать каждый слой|
Упомянуть альтернативные решения (например, TCA для SwiftUI)-->
4. Многопоточность: GCD, OperationQueue и Combine
Вопросы про потоки — это лакмусовая бумажка вашего опыта. Junior должен знать базовые DispatchQueue, Middle — понимать OperationQueue и async/await, а Senior — разбираться в race conditions и DispatchSemaphore.
Топ-5 вопросов:
- 🧵 Чем
.mainотличается от.global()? (ответ: сериальная vs. конкурентная очередь) - 🧵 Как избежать deadlock при использовании
sync? (ключевое: не вызыватьsyncна текущей очереди) - 🧵 Зачем нужен
[weak self]в замыканиях? (объясните retain cycle) - 🧵 Как работает
async/awaitпод капотом? (упомянитеContinuation) - 🧵 Чем
OperationQueueлучшеDispatchQueue? (ответ: зависимости между задачами,isCancelled)
На Senior-позициях могут спросить про:
- 🔥 Как дебажить race conditions? (инструменты:
Thread Sanitizer,os_log) - 🔥 Как организовать отмену сетевых запросов? (например, через
URLSessionTask+cancel())
Пример кода с deadlock
```swift
DispatchQueue.main.sync {
print("Это вызовет deadlock!")
}
```
Почему: sync блокирует текущий поток (главный), ожидая завершения задачи... которая никогда не начнется, потому что главный поток заблокирован.
5. Сетевой слой: URLSession, Alamofire и обработка ошибок
Даже если в проекте используется Alamofire, спрашивают про нативный URLSession. Интервьюеры хотят убедиться, что вы понимаете:
- 🌐 Как работает
URLSessionDataTaskvs.URLSessionDownloadTask. - 🌐 Как обрабатывать ошибки (например,
401 Unauthorizedvs.500 Server Error). - 🌐 Как кэшировать ответы? (упомяните
URLCacheиCache-Controlзаголовки).
Типичная задача на собеседовании:
"Представьте, что сервер возвращает
429 Too Many Requests. Как бы вы организовали повторный запрос с экспоненциальным бэкоффом?"
Ожидаемый ответ:
- Использовать
DispatchQueueс задержкой. - Увеличивать таймаут после каждой неудачной попытки (например, 1с → 2с → 4с).
- Ограничить количество попыток (например, 3 раза).
6. Хранение данных: Core Data, UserDefaults и Realm
Core Data спрашивают в 80% случаев, даже если в проекте используется Realm или SQLite. Интервьюеры проверяют понимание:
- 💾 Чем
NSManagedObjectотличается от обычного класса. - 💾 Как работает
NSFetchedResultsController. (ключевое: инкрементальные обновленияUITableView) - 💾 Когда использовать
UserDefaults, а когда —Keychain. (ответ:UserDefaultsдля настроек,Keychainдля паролей)
На Middle/Senior могут дать задачу:
"Как бы вы организовали офлайн-режим для приложения с чатом? Где хранить неотправленные сообщения?"
Правильный ответ:
- Неотправленные сообщения — в Core Data (или Realm) с флагом
isSent. - При восстановлении связи — отправить их через сеть и обновить флаг.
- Для конфликтов (если сообщение изменилось на сервере) — использовать
timestampилиversion.
7. Алгоритмы и структуры данных: что спрашивают у iOS-разработчиков
Да, алгоритмы спрашивают и у мобильных разработчиков! Но здесь акцент на:
- 📊 Структуры данных:
Arrayvs.Setvs.Dictionary(когда какую использовать). - 📊 Сортировки:
sort()vs. кастомный компаратор. - 📊 Задачи на строки: палиндром, поиск подстроки.
Пример задачи (из собеседования в Avito):
"Дан массив целых чисел. Нужно найти первую пару, сумма которой равна заданному числу. Оптимизируйте по времени."
Решение:
- Использовать
Dictionaryдля хранения разницы (target - current). - Проходим массив один раз —
O(n)вместоO(n²).
На Senior-позициях могут спросить про:
- 🧠 Как работает
Diffable Data Sourceпод капотом? (ответ: сравнение хэшей,NSOrderedSet) - 🧠 Как оптимизировать поиск в большом
UITableView? (упомянитеUISearchController+NSPredicate)
8. Вопросы про опыт: как рассказать о проектах и не провалиться
Здесь интервьюеры оценивают не столько технические навыки, сколько умение решать проблемы. Типичные вопросы:
- 💼 "Расскажите про самый сложный баг в вашем проекте." (ожидают: симптомы → диагностика → решение)
- 💼 "Как вы тестируете свой код?" (упомяните
XCTest,Quick/Nimble, UI-тесты) - 💼 "Как вы работаете с дизайнерами?" (ключевое: Figma, Zeplin, согласование анимаций)
Самая большая ошибка кандидатов — расказывать про задачи, а не про результаты. Например:
❌ "Я делал экран профиля."
✅ "Я оптимизировал загрузку профиля на 40% за счет кэширования аватаров и ленивой подгрузки данных."
FAQ: Ответы на неудобные вопросы
🔍 Почему вас уволили с прошлого места работы?
Честно, но без негатива. Примеры:
- "Компания сменила приоритеты и сократила отдел."
- "Я хотел развиваться в SwiftUI, а в проекте использовался только UIKit."
Никогда не говорите: "Начальник был идиот" или "Зарплата была низкой".
💰 Какую зарплату вы хотите?
Ответьте вопросом: "Какой бюджет заложен на эту позицию?". Если настаивают:
- Назовите вилку (например, "180–220к на руки").
- Уточните, что готовы обсудить после тестового задания.
🚀 Что вы знаете про новые фичи iOS 17?
Упомяните 2–3 фичи, relevantные для разработки:
- SwiftData — замена Core Data для SwiftUI.
Observablemacro — упрощение реактивности.- Новые анимации в SwiftUI (
.keyframeAnimator).
Если не следили за обновлениями, скажите: "Я фокусировался на текущих задачах, но планирую изучить SwiftData в ближайшее время".
🛠️ Как вы дебажите производительность?
Перечислите инструменты:
- Instruments (
Time Profiler,Allocations). os_signpostдля логгирования.- Xcode Metrics (Energy Log, GPU Report).
Пример из практики: "В одном проекте UITableView тормозил при скролле. Через Instruments нашел, что проблема в тяжелых ячейках — оптимизировал с помощью prefetching и estimatedRowHeight".
🤖 Как вы относитесь к тестированию?
Правильный ответ:
- "Пишу
XCTestдля критичных частей (сеть, бизнес-логика)." - "Использую Snapshot Testing для UI (например, PointFree)."
- "На больших проектах настраиваю CI/CD с запуском тестов на каждом пулл-реквесте."
Если опыта мало: "Я осознаю важность тестов и готов развиваться в этом направлении".