Вопросы по Swift и iOS
Всё, что спрашивают на iOS-собесе: от struct и опционалов до ARC, Swift Concurrency, UIKit, SwiftUI, сети, хранения и публикации. Плюс задачи на Swift с автопроверкой.
Проверьте себя: тест по Swift и iOS
20 вопросов, 10 минут, уровень junior, middle или senior
Типы значений и ссылочные
struct, class и enum, семантика копирования, copy-on-write, mutating, identity и равенство.
Урок: Типы значений и ссылочные типы в Swift 7 мин- Copy-on-write у Array: когда копируется буфер
- Модификаторы borrowing и consuming
- Как сделать свой copy-on-write
- Existential container: как хранится any Protocol
- Типы значений и ссылочные типы в Swift
- Оператор === в Swift
- Зачем indirect у enum
- Задача на Swift: стек отмены для текстового поля
Ещё 16 вопросов и задач
- let и экземпляр класса: можно ли менять свойства
- Типы Swift: значение или ссылка
- Когда пропадает memberwise-инициализатор структуры
- Зачем нужен mutating в структуре
- Некопируемые типы ~Copyable в Swift
- Что выведет Swift: массив объектов после копирования
- Что выведет Swift: общий экземпляр класса
- Что выведет Swift: mutating-метод enum
- Что выведет Swift: копия структуры
- Что выведет Swift: структура с классом внутри
- Как работает copy-on-write в Swift
- Чем struct отличается от class в Swift
- Всегда ли структура лежит на стеке
- Что происходит при присваивании структуры в Swift
- Структура со ссылкой на класс внутри
- Когда выбирать класс, а не структуру
Опционалы
Optional как enum, if let и guard let, ??, опциональные цепочки, force unwrap и IUO.
Урок: Опционалы в Swift без крэшей 6 мин- Тип результата опциональной цепочки
- compactMap и опционалы
- Ранний выход через guard let
- Проваливаемый инициализатор init?
- Паттерн case let x? в Swift
- Способы распаковать опционал в Swift
- Что делает force unwrap
- Разница между guard let и if let
Ещё 13 вопросов и задач
- Implicitly unwrapped optional: где уместен
- Задача на Swift: цепочка руководителей
- Задача на Swift: сумма корректных чисел из ввода
- Задача на Swift: безопасный доступ к массиву по индексу
- map и flatMap у Optional
- Оператор ?? в Swift
- Сравнение опционалов и двойные опционалы
- Что выведет Swift: опциональная цепочка и ??
- Что выведет Swift: двойной опционал в словаре
- Force unwrap в продакшен-коде: политика команды
- Как устроены опционалы в Swift
- Почему weak-ссылка всегда опциональна
- Что такое Optional в Swift
Коллекции и строки
Array, Dictionary, Set, сложность операций, map/filter/reduce, String и Character, индексы строк.
Урок: Коллекции и строки в Swift 7 мин- Сложность append у Array в Swift
- ContiguousArray и мост с NSArray
- Подсчёт частот в словаре
- Порядок ключей в Dictionary
- Сложность операций коллекций Swift
- String и NSString: длина и индексы
- Как взять n-й символ строки в Swift
- Сколько символов в строке с флагом
Ещё 28 вопросов и задач
- Контракт Hashable в Swift
- Задача на Swift: сгруппировать анаграммы
- Задача на Swift: правильная скобочная последовательность
- Задача на Swift: убрать дубликаты с сохранением порядка
- Задача на Swift: первый неповторяющийся символ
- Задача на Swift: подмассив с максимальной суммой
- Задача на Swift: самая длинная подстрока без повторов
- Задача на Swift: слияние интервалов
- Задача на Swift: слияние двух отсортированных массивов
- Задача на Swift: палиндром без учёта регистра и знаков
- Задача на Swift: перевернуть порядок слов
- Задача на Swift: сжатие строки RLE
- Задача на Swift: циклический сдвиг массива
- Задача на Swift: k самых частых слов
- Задача на Swift: два товара на заданную сумму
- Ленивые последовательности lazy
- Какую коллекцию Swift выбрать
- Изменение ключа после вставки в Set
- Как Dictionary находит значение по ключу
- Что выведет Swift: группировка через reduce(into:)
- Что выведет Swift: индексы среза массива
- Что выведет Swift: длина строки с флагом в разных представлениях
- Индексы ArraySlice
- Array, Set или Dictionary: как выбрать коллекцию
- Как устроены строки в Swift
- Почему String.count в Swift работает за O(n)
- Почему s[0] не работает со String
- Substring и память
Протоколы, POP и дженерики
Протоколы и расширения, диспетчеризация, associatedtype, some и any, ограничения дженериков.
Урок: Протоколы, POP и дженерики в Swift 7 мин- Протокол делегата и weak
- Протокол с associatedtype как тип параметра
- Условное соответствие протоколу
- Метод из расширения протокола: какая реализация вызовется
- Ограничение дженерика Comparable
- Как ускорить вызов методов класса
- Что такое associatedtype
- Виды диспетчеризации в Swift
Ещё 15 вопросов и задач
- Type erasure в Swift
- Специализация дженериков
- Задача на Swift: k-й по величине в потоке через кучу
- Задача на Swift: LRU-кеш для картинок
- Задача на Swift: дженерик-очередь на двух стеках
- Какой вызов как диспетчеризуется
- Что выведет Swift: требование протокола и метод расширения
- Что выведет Swift: перегрузка и дженерик
- Что выведет Swift: подкласс и реализация по умолчанию
- Протокольно-ориентированное программирование
- Ретроактивное соответствие и @retroactive
- Требование Self в протоколе
- Разница между some и any в Swift
- Протокольно-ориентированное программирование в Swift
- some и any: opaque и existential типы
Замыкания и захват
Синтаксис замыканий, захват значений и список захвата, @escaping, autoclosure, trailing closure.
Урок: Замыкания и захват значений в Swift 6 мин- Зачем нужен @autoclosure
- Захват переменной замыканием в Swift
- Список захвата замыкания
- Что значит @escaping
- Escaping-замыкание и mutating self
- Почему non-escaping замыкания дешевле
- Сокращённый синтаксис замыканий в Swift
- Паттерн weak self в замыкании
Ещё 16 вопросов и задач
- Неявный self в escaping-замыкании
- Задача на Swift: debounce для поиска
- Задача на Swift: сортировка контактов по нескольким полям
- Задача на Swift: конвейер преобразований из замыканий
- Задача на Swift: throttle для кнопки
- Цикл через lazy-свойство с замыканием
- Замыкания в цикле for-in
- Атрибуты и формы замыканий
- Опциональное замыкание-параметр и @escaping
- Что выведет Swift: ленивость @autoclosure
- Что выведет Swift: захват по ссылке и список захвата
- Что выведет Swift: счётчик на замыкании
- Что выведет Swift: замыкания в for-in и while
- Замыкания в Swift: значение или ссылка
- Completion handler или async/await
- Как замыкания захватывают значения в Swift
ARC и циклы ссылок
Подсчёт ссылок, strong, weak и unowned, циклы в делегатах и замыканиях, deinit и утечки.
Урок: ARC, weak, unowned и циклы ссылок 7 мин- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Почему делегат объявляют weak
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок
Ещё 13 вопросов и задач
- Инструменты для поиска проблем с памятью
- Утечка через NotificationCenter
- Порядок событий при освобождении объекта
- Что выведет Swift: когда вызывается deinit
- Что выведет Swift: владелец и слабая обратная ссылка
- Что выведет Swift: замыкание с weak self после освобождения
- Как хранятся weak-ссылки в Swift
- ARC и сборка мусора: сравнение
- Циклы ссылок в iOS: где возникают и как найти
- Цена копирования структур со ссылками
- Почему Timer держит контроллер
- Разница между weak и unowned
- Когда ARC освобождает объект
Ошибки
throws, do/catch, try? и try!, Result, typed throws, defer и rethrows.
Урок: Обработка ошибок в Swift 6 мин- assert, precondition и fatalError
- Сопоставление ошибок в catch
- Сколько стоят ошибки в Swift
- Порядок выполнения defer
- Синтаксис do/try/catch
- Отмена задачи и ошибки
- Как объявить свою ошибку в Swift
- Конвертация между Result и throws
Ещё 14 вопросов и задач
- Задача на Swift: калькулятор в обратной польской записи с ошибками
- Задача на Swift: валидация формы регистрации
- Формы try в Swift
- Тип Never в Swift
- Что выведет Swift: defer внутри do и catch
- Что выведет Swift: defer и возвращаемое значение
- Что выведет Swift: try? и опциональный результат
- Result или throws
- Что означает rethrows
- Стратегия обработки ошибок в iOS-приложении
- Typed throws: когда использовать
- Что делает try? в Swift
- Вызов бросающей функции в Swift
- Typed throws в Swift 6
Swift Concurrency
async/await, Task и структурированная конкурентность, actors, MainActor, Sendable и Swift 6.
Урок: Swift Concurrency: async/await, акторы, Sendable 8 мин- Что гарантирует actor
- Реентерабельность акторов
- async let и параллельная загрузка
- Что происходит на await в Swift
- Как работает отмена Task
- Блокировка внутри async-кода
- Изоляция по умолчанию в Swift 6.2
- AsyncStream для событий
Ещё 13 вопросов и задач
- Обернуть callback-API в async
- Что такое @Sendable-замыкание
- withTaskGroup: параллельная загрузка списка
- Зачем нужен @MainActor
- Инструменты Swift Concurrency
- Порядок миграции модуля на Swift 6
- Код-ревью: загрузчик картинок на Swift Concurrency
- Когда структура Sendable
- Акторы в Swift: изоляция и реентерабельность
- GCD или Swift Concurrency: что выбрать
- Что меняет языковой режим Swift 6
- Task и Task.detached: разница
- Изоляция SwiftUI View
GCD и OperationQueue
Очереди и QoS, sync и async, deadlock, барьеры, DispatchGroup, семафоры, Operation.
Урок: GCD и OperationQueue 7 мин- Асинхронная Operation
- Барьер для потокобезопасного кеша
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- Как дождаться нескольких запросов в GCD
- Задача на Swift: операции с зависимостями и критический путь
- Задача на Swift: OperationQueue с ограничением параллельности
Ещё 12 вопросов и задач
- DispatchQueue.main.sync на главном потоке
- Инструменты GCD и их задачи
- Синхронный доступ к состоянию без очереди
- Чем OperationQueue лучше голого GCD
- Что выведет Swift: async и sync на последовательной очереди
- QoS для загрузки по нажатию
- Последовательная и параллельная очередь
- Взаимные блокировки в GCD
- OperationQueue или GCD
- sync и async в GCD
- Thread explosion в GCD
- Обновление UI из фонового потока
UIKit
Жизненный цикл приложения и UIViewController, Auto Layout, UITableView и UICollectionView, diffable data source.
Урок: UIKit: жизненный цикл, Auto Layout, списки 8 мин- Неверная картинка в переиспользуемой ячейке
- Diffable data source и повторяющиеся идентификаторы
- Что делать в prepareForReuse
- reconfigureItems и reloadItems
- Ячейки с автоматической высотой
- Разница между frame и bounds
- Где брать финальный размер view
- Почему кнопка не получает нажатия
Ещё 13 вопросов и задач
- Content hugging и compression resistance
- Задача на Swift: разница снимков для diffable data source
- setNeedsLayout и layoutIfNeeded
- Методы UIKit и момент вызова
- Тени и скругления в списках
- Порядок жизненного цикла UIViewController
- Код-ревью: ячейка ленты в UITableView
- Таймер останавливается при скролле
- AppDelegate и SceneDelegate
- Плавный скролл длинного списка в UIKit
- Жизненный цикл UIViewController
- translatesAutoresizingMaskIntoConstraints
- Сколько раз вызывается viewDidLoad
SwiftUI
Декларативный UI, идентичность view, @State, @Binding, @Observable, @Environment, навигация и списки.
Урок: SwiftUI: состояние, идентичность, Observation 8 мин- Чем вредит AnyView
- Что такое @Binding
- Побочные эффекты в body
- Крэш с EnvironmentObject
- @State и передача биндинга
- Идентичность view в SwiftUI
- SwiftUI и UIKit в одном проекте
- Обёртки состояния SwiftUI
Ещё 13 вопросов и задач
- Идентификаторы в ForEach
- Структурная идентичность и if/else
- Какую обёртку SwiftUI выбрать
- Навигация в SwiftUI
- @Observable против ObservableObject
- Потеря состояния у @ObservedObject
- Как SwiftUI обновляет экран
- Код-ревью: экран профиля на SwiftUI
- Управление состоянием в SwiftUI
- SwiftUI или UIKit в 2026 году
- Для чего @State
- Модификатор .task
- Что такое View в SwiftUI
Сеть, Codable и хранение
URLSession и async/await, Codable, UserDefaults, Keychain, Core Data и SwiftData, файлы.
Урок: Сеть, Codable и хранение данных в iOS 8 мин- App Transport Security
- Загрузка видео в фоне
- Core Data и потоки
- Куда сохранять кеш картинок на диске
- Свой init(from:) в Codable
- HTTP-кеш в URLSession
- Доступность элементов Keychain
- Задача на Swift: повтор запроса с экспоненциальной задержкой
Ещё 11 вопросов и задач
- Один битый элемент ломает весь массив
- Какое хранилище выбрать на iOS
- Отсутствующее поле при декодировании
- Этапы сетевого запроса в клиенте
- Параллельное обновление токена
- snake_case в JSON и Codable
- Как спроектировать сетевой слой iOS-приложения
- Core Data, SwiftData, SQLite или файлы
- URLSession и HTTP-статусы ошибок
- Что такое SwiftData
- Где хранить токен авторизации
Производительность и тестирование
Instruments, отрисовка и hitches, запуск приложения, XCTest и Swift Testing, моки и UI-тесты.
Урок: Производительность и тестирование iOS-приложений 7 мин- Тест в Swift Testing
- Hang и hitch: разница
- Пирамида тестов в iOS
- Тестирование сетевого слоя через URLProtocol
- Бюджет кадра на iPhone с ProMotion
- Сколько памяти занимает декодированная картинка
- Приложение пропадает без крэш-лога
- Задача на Swift: статистика рывков по длительностям кадров
Ещё 12 вопросов и задач
- Задача на Swift: худший отрезок кадров скользящим окном
- Как ускорить запуск приложения
- Шаблоны Instruments
- Метрики производительности у реальных пользователей
- Как ускорить холодный старт iOS-приложения
- Стратегия тестирования iOS-приложения
- Swift Testing и XCTest
- Стаб, мок, фейк и спай
- Тестирование кода со временем
- Каким инструментом найти тяжёлый код
- Как поймать гонку данных
- Как находить элементы в UI-тестах
Сборка и публикация в App Store
Подпись и профили, схемы и конфигурации, SPM, TestFlight, App Review, privacy manifest и поэтапный релиз.
Урок: Сборка, подпись и публикация в App Store 6 мин- Удаление аккаунта и App Review
- Зачем нужен dSYM
- Entitlements и capabilities
- Частые причины отклонения на App Review
- Подпись iOS-приложения
- Оплата цифровых товаров в iOS-приложении
- Задача на Swift: сравнение версий для принудительного обновления
- Бинарный фреймворк и стабильность модуля
Ещё 12 вопросов и задач
- Артефакты сборки и публикации
- Путь сборки от Xcode до App Store
- Поэтапный релиз в App Store
- Privacy manifest и required reason API
- Что содержит provisioning profile
- Отклонение на App Review из-за входа
- Принудительное обновление мобильного приложения
- Процесс релиза iOS-приложения
- Swift Package Manager
- Внешнее тестирование в TestFlight
- Версия и номер сборки
- Окружения dev, stage, prod