Підготовка до співбесіди · IT та розробка

Питання на співбесіді iOS-розробника

Питання на співбесіді iOS-розробника: Swift, керування пам'яттю, Swift Concurrency і Swift 6, SwiftUI та UIKit, архітектура, тестування й публікація в App Store. Для Junior, Middle і Senior.

Популярні теми

Junior Swift

Що таке Optional і як безпечно його розгорнути?

Приклад відповіді

Optional — тип, який може містити значення або nil: String?. Безпечні способи розгортання: if let, guard let, оператор ?? для значення за замовчуванням і опціональний ланцюжок user?.address?.city.

Примусове розгортання ! падає при nil, тому його використовують лише там, де nil справді неможливий. guard let зручний для раннього виходу з функції.

Junior Swift

Чим struct відрізняється від class у Swift?

Приклад відповіді

Структури — типи-значення: копіюються при присвоєнні й передачі, не мають наслідування. Класи — типи-посилання: кілька змінних вказують на один об'єкт, є наслідування і деініціалізатор.

Apple рекомендує за замовчуванням використовувати структури — вони безпечніші в багатопотоковому коді. SwiftUI-представлення теж є структурами. Класи обирають, коли потрібна спільна змінювана ідентичність або сумісність з Objective-C.

Junior SwiftUI і UIKit

Навіщо @State і @Binding у SwiftUI?

Приклад відповіді

@State — локальний стан, яким володіє представлення; при зміні SwiftUI перемальовує UI. @Binding — двостороннє посилання на чужий стан: дочірнє представлення може змінювати значення батьківського.

Для спільних моделей у сучасному SwiftUI використовують макрос @Observable (iOS 17+) разом із @State або @Environment, замість старих ObservableObject і @Published.

Junior Пам'ять

Як працює ARC?

Приклад відповіді

ARC (Automatic Reference Counting) рахує сильні посилання на об'єкт класу й звільняє пам'ять, коли лічильник стає нулем. Це відбувається детерміновано, без збирача сміття.

Проблема — цикли посилань: якщо два об'єкти тримають один одного сильно, вони ніколи не звільняться. Тому одне з посилань роблять weak або unowned.

Middle Пам'ять

Коли в замиканні потрібно [weak self]?

Приклад відповіді

Коли замикання зберігається об'єктом (self), і саме воно захоплює self — виникає цикл: об'єкт тримає замикання, замикання тримає об'єкт. Типові випадки: колбеки, підписки Combine, таймери, збережені обробники.

Для одноразових замикань, які не зберігаються (наприклад, map чи анімація UIView), weak не потрібен. unowned безпечний лише тоді, коли об'єкт гарантовано живе довше за замикання — інакше креш.

Middle Concurrency

Що таке actor і навіщо @MainActor?

Приклад відповіді

Actor — тип, який захищає свій змінюваний стан: до нього звертаються по черзі, тому гонки даних неможливі. Виклики ззовні асинхронні (await).

@MainActor — глобальний actor головного потоку: позначені ним класи й функції виконуються на main thread. Так позначають ViewModel і код роботи з UI, щоб компілятор сам перевіряв, що інтерфейс не оновлюється з фонового потоку.

Middle Concurrency

Що змінив Swift 6 із суворою перевіркою конкурентності?

Приклад відповіді

У режимі Swift 6 компілятор перевіряє гонки даних на етапі компіляції: значення, що передаються між потоками й акторами, мають бути Sendable, а доступ до стану — ізольованим.

Міграція великих проєктів поступова: вмикають перевірки по модулях, позначають типи Sendable, переносять UI-код на @MainActor, а легасі-колбеки обгортають у async через withCheckedContinuation. Сильна відповідь — з досвідом такої міграції.

Middle Архітектура й релізи

Яку архітектуру ви обираєте для SwiftUI-застосунку?

Приклад відповіді

Найпоширеніша — MVVM: View відображає стан, ViewModel (@Observable, @MainActor) готує дані й обробляє дії, нижче — сервіси й репозиторії. Для складних застосунків використовують The Composable Architecture (TCA) з передбачуваним станом і зручним тестуванням.

Важливіше за назву — тестованість і залежності через протоколи, щоб у тестах і прев'ю підставляти моки. Навігацію виносять у координатор або NavigationStack зі станом шляху.

Senior Архітектура й релізи

Як організувати модульність великого iOS-застосунку?

Приклад відповіді

Swift Package Manager для локальних пакетів: Core, DesignSystem, Networking, окремі пакети фіч. Залежності спрямовані від фіч до ядра, фічі не імпортують одна одну — взаємодіють через протоколи.

Переваги: швидша інкрементальна збірка, ізольовані прев'ю й тести, незалежна робота команд. Важливо стежити за часом збірки та розміром бінарника, використовуючи статичні бібліотеки там, де це доцільно.

Senior SwiftUI і UIKit

Як шукаєте проблеми продуктивності в iOS-застосунку?

Приклад відповіді

Instruments: Time Profiler для CPU, Allocations і Leaks для пам'яті, SwiftUI-інструмент для зайвих оновлень представлень, Hangs для блокувань головного потоку. MetricKit і Xcode Organizer показують реальні дані з пристроїв користувачів.

Типові причини: важкі обчислення в body, синхронна робота з диском на main thread, великі зображення без зменшення, неефективні списки. Оптимізують після вимірювань і порівнюють результат.

Senior Concurrency

Як скасовувати асинхронні задачі в Swift Concurrency?

Приклад відповіді

Скасування кооперативне: task.cancel() лише ставить прапорець, а код має перевіряти Task.isCancelled або викликати try Task.checkCancellation(). Системні async-API (наприклад, URLSession) реагують на скасування самі.

У SwiftUI модифікатор .task { } автоматично скасовує задачу, коли представлення зникає. Для груп підзадач — withTaskGroup: при скасуванні батька скасовуються всі дочірні.

Senior Архітектура й релізи

Як ви налаштовуєте CI/CD і релізний процес для iOS?

Приклад відповіді

Збірка й тести в CI (Xcode Cloud, GitHub Actions, Bitrise), автоматизація підпису й завантаження через fastlane або App Store Connect API. TestFlight для внутрішніх і зовнішніх тестувальників.

На релізі — поступове розгортання (phased release), моніторинг крашів (Crashlytics, Xcode Organizer), feature flags для вимкнення функцій без нового релізу. Також треба враховувати вимоги App Store: privacy manifests, опис використання даних і відповіді на рев'ю.

Типові помилки кандидатів

  • Розгортати Optional через `!` скрізь, де «не має бути nil».
  • Не розуміти, коли потрібен `[weak self]`, і плодити витоки пам'яті.
  • Оновлювати UI з фонового потоку.
  • Знати лише UIKit або лише SwiftUI, не розуміючи, як їх поєднати.
  • Не мати досвіду з async/await і Swift Concurrency.

Як підготуватися

  • Повторіть ARC, цикли посилань і різницю weak та unowned.
  • Розберіться в акторах, Sendable і суворій перевірці конкурентності Swift 6.
  • Підготуйте приклад екрана на SwiftUI з @Observable ViewModel.
  • Будьте готові розповісти, як проходили рев'ю App Store і що робили при відмові.
  • Покажіть застосунок в App Store або відкритий проєкт на GitHub.

Актуальні вакансії: iOS Developer

Схожі професії

Перевірте знання перед співбесідою

Випадкові питання, таймер на кожну відповідь і розбір помилок наприкінці. Можна пройти кілька разів — питання щоразу інші.