Что спрашивают на собеседовании iOS-разработчика: разбор вопросов по уровням

Почему вопросы на собеседовании 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 let vs. if let? (ключевое — область видимости и ранний выход)
  • 🔹 Объясните lazy var и где его применять. (пример: тяжелые ресурсы, которые не нужны при инициализации)
  • 🔹 Что такое @autoclosure и где используется? (например, в assert)

На уровне Middle добавляются вопросы про:

  • 🔹 Property Wrappers (например, @Published в Combine)
  • 🔹 Операторы ?? и !: когда какой использовать.
  • 🔹 Как работает Equatable для кастомных типов.
⚠️ Внимание: Если вас спрашивают про mirror(of:) или MemoryLayout — это либо Senior-позиция, либо интервьюер пытается вывести вас на разговор про низкоуровневую оптимизацию. Не паникуйте: честно скажите, что использовали это только для дебага.
📊 Какой вопрос по Swift вам кажется самым сложным?
Разница между value и reference типами
Замыкания и @escaping
Property Wrappers
Операторы ?? и !
Другой

2. UIKit vs. SwiftUI: что спрашивают и как отвечать

Здесь всё зависит от стека компании. Стартапы и продукты с современным дизайном (например, Duolingo или Notion) часто используют SwiftUI, а банки и enterprise-проекты — UIKit. Но даже если вакансия про SwiftUI, вопросы про жизненный цикл UIViewController задают в 70% случаев.

Типичные вопросы по UIKit:

  • 📱 Чем frame отличается от bounds? (ожидают пример с вращением вью)
  • 📱 Как работает autolayout под капотом? (упомяните layoutIfNeeded() и setNeedsLayout())
  • 📱 Зачем нужен UIViewController, если можно обойтись UIView? (ключевое: управление жизненным циклом, навигация)

По SwiftUI спрашивают:

  • 🎨 Как работает @State vs. @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 и другие буковки

Здесь интервьюеры делятся на два лагеря:

  1. Теоретики — спрашивают про различия между MVC, MVVM и VIPER (ожидают схемы и примеры кода).
  2. Практики — дают задачу типа "Как бы вы структурировали приложение для мессенджера?" и смотрят на ход мыслей.

Самые частые вопросы:

  • 🏗️ Чем плох 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. Интервьюеры хотят убедиться, что вы понимаете:

  • 🌐 Как работает URLSessionDataTask vs. URLSessionDownloadTask.
  • 🌐 Как обрабатывать ошибки (например, 401 Unauthorized vs. 500 Server Error).
  • 🌐 Как кэшировать ответы? (упомяните URLCache и Cache-Control заголовки).

Типичная задача на собеседовании:

"Представьте, что сервер возвращает 429 Too Many Requests. Как бы вы организовали повторный запрос с экспоненциальным бэкоффом?"

Ожидаемый ответ:

  1. Использовать DispatchQueue с задержкой.
  2. Увеличивать таймаут после каждой неудачной попытки (например, 1с → 2с → 4с).
  3. Ограничить количество попыток (например, 3 раза).

6. Хранение данных: Core Data, UserDefaults и Realm

Core Data спрашивают в 80% случаев, даже если в проекте используется Realm или SQLite. Интервьюеры проверяют понимание:

  • 💾 Чем NSManagedObject отличается от обычного класса.
  • 💾 Как работает NSFetchedResultsController. (ключевое: инкрементальные обновления UITableView)
  • 💾 Когда использовать UserDefaults, а когда — Keychain. (ответ: UserDefaults для настроек, Keychain для паролей)

На Middle/Senior могут дать задачу:

"Как бы вы организовали офлайн-режим для приложения с чатом? Где хранить неотправленные сообщения?"

Правильный ответ:

  1. Неотправленные сообщения — в Core Data (или Realm) с флагом isSent.
  2. При восстановлении связи — отправить их через сеть и обновить флаг.
  3. Для конфликтов (если сообщение изменилось на сервере) — использовать timestamp или version.

7. Алгоритмы и структуры данных: что спрашивают у iOS-разработчиков

Да, алгоритмы спрашивают и у мобильных разработчиков! Но здесь акцент на:

  • 📊 Структуры данных: Array vs. Set vs. Dictionary (когда какую использовать).
  • 📊 Сортировки: sort() vs. кастомный компаратор.
  • 📊 Задачи на строки: палиндром, поиск подстроки.

Пример задачи (из собеседования в Avito):

"Дан массив целых чисел. Нужно найти первую пару, сумма которой равна заданному числу. Оптимизируйте по времени."

Решение:

  1. Использовать Dictionary для хранения разницы (target - current).
  2. Проходим массив один раз — 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.
  • Observable macro — упрощение реактивности.
  • Новые анимации в SwiftUI (.keyframeAnimator).

Если не следили за обновлениями, скажите: "Я фокусировался на текущих задачах, но планирую изучить SwiftData в ближайшее время".

🛠️ Как вы дебажите производительность?

Перечислите инструменты:

  • Instruments (Time Profiler, Allocations).
  • os_signpost для логгирования.
  • Xcode Metrics (Energy Log, GPU Report).

Пример из практики: "В одном проекте UITableView тормозил при скролле. Через Instruments нашел, что проблема в тяжелых ячейках — оптимизировал с помощью prefetching и estimatedRowHeight".

🤖 Как вы относитесь к тестированию?

Правильный ответ:

  1. "Пишу XCTest для критичных частей (сеть, бизнес-логика)."
  2. "Использую Snapshot Testing для UI (например, PointFree)."
  3. "На больших проектах настраиваю CI/CD с запуском тестов на каждом пулл-реквесте."

Если опыта мало: "Я осознаю важность тестов и готов развиваться в этом направлении".