Вопросы на собеседовании: iOS-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: iOS-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
let объявляет константу без возможности повторного присваивания, а var объявляет значение, которое можно менять.
- По умолчанию лучше выбирать let, поскольку он явно показывает намерение сохранить значение неизменным.
- Ссылка let на экземпляр класса не может указывать на другой объект, но изменяемые свойства самого объекта всё ещё можно менять.
- У struct в let нельзя менять переменные свойства, поскольку всё значение является константой.
Зачем это спрашивают: Интервьюер проверяет понимание правил присваивания и влияния value и reference semantics.
Swift обычно выводит тип переменной из начального значения, а аннотация напрямую задаёт требуемый тип.
- let count = 3 получает тип Int, а let price: Double = 3 явно запрашивает Double.
- Аннотация полезна, когда нужный protocol, числовой тип или optionality неочевидны из initializer.
- Swift остаётся статически типизированным, поэтому переменная с выведенным типом не сможет позже хранить несвязанный тип.
Зачем это спрашивают: Сильный ответ отличает компактный вывод типа от динамической типизации и объясняет пользу аннотаций.
Optional представляет либо обёрнутое значение определённого типа, либо отсутствие значения как nil.
- String? является сокращением для Optional<String> и не используется как обычный String без обработки nil.
- Optionals делают отсутствие данных частью системы типов вместо специальных условных значений.
- Частые источники включают неудачный поиск, отсутствующий ввод и API, где результата может не быть.
Зачем это спрашивают: Интервьюер оценивает понимание nil как явного состояния типа, а не обычного значения любого типа.
Optional следует распаковывать через optional binding, guard, optional chaining или оправданное значение по умолчанию.
- if let обрабатывает значение внутри одной ветки, а guard let рано выходит и оставляет распакованное значение доступным дальше.
- Оператор nil-coalescing задаёт fallback, а optional chaining продолжает цепочку только при наличии значения.
- Force unwrap через ! допустим лишь при настоящей гарантии значения, поскольку nil приведёт к runtime crash.
Зачем это спрашивают: Сильный ответ показывает несколько безопасных инструментов и считает force unwrap исключением с гарантированной инвариантой.
guard полезен для ранней проверки обязательных условий и уменьшает вложенность основного успешного пути.
- Ветка guard обязана передать управление через return, throw, break или continue при невыполненном условии.
- Значения из guard let остаются доступными в остальной части текущей области.
- Он подходит для обязательных предусловий, а if понятнее, когда обе ветки являются обычными вариантами.
Зачем это спрашивают: Интервьюер проверяет выбор управления потоком по семантике раннего выхода, а не только по стилю.
Optional chaining безопасно проходит по свойствам и методам optional, а nil coalescing задаёт fallback, если результат равен nil.
- user.profile?.displayName возвращает optional, поскольку любое optional-звено может отсутствовать.
- Добавление ?? "Guest" преобразует отсутствующий результат в неoptional значение для отображения.
- Цепочка убирает глубокую вложенность binding, когда операция должна продолжаться только для существующих значений.
Зачем это спрашивают: Интервьюер оценивает безопасный доступ и осознанный fallback без force unwrap.
Struct является value type, а class является reference type с идентичностью, наследованием и deinitialization.
- Присваивание или передача struct создаёт логически независимое значение через copy semantics.
- Присваивание экземпляра class копирует ссылку, поэтому несколько переменных видят изменения одного объекта.
- Struct предпочтителен для простых моделей данных, а class нужен при общей идентичности или class-only поведении.
Зачем это спрашивают: Сильный ответ связывает возможности языка с владением и моделированием, а не только перечисляет синтаксис.
Value semantics дают каждой переменной своё логическое значение, а reference semantics позволяют переменным разделять один экземпляр объекта.
- Swift structs, enums, arrays и dictionaries используют value semantics.
- Экземпляры классов используют reference semantics, поэтому изменение через одну ссылку видно через остальные.
- Value semantics уменьшают случайное общее изменение, а reference semantics полезны при важной идентичности объекта.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат предсказать результат присваивания и изменения частых типов Swift.
Методу struct нужен mutating, когда он меняет stored property или заменяет self.
- Методы экземпляра value type по умолчанию являются nonmutating.
- Keyword явно сообщает, что вызов может создать изменённое значение.
- Метод всё равно не сможет изменить экземпляр, хранящийся в константе let.
Зачем это спрашивают: Интервьюер оценивает понимание правил изменения value types.
Raw value является заранее заданной константой case, а associated values несут данные конкретного экземпляра enum.
- Raw values имеют один общий тип вроде String или Int и могут поддерживать инициализацию из него.
- Associated values могут иметь разные типы и labels для разных cases.
- Switch извлекает associated data через pattern matching, поэтому enums подходят для состояний с разной нагрузкой.
Зачем это спрашивают: Сильный ответ отличает постоянные метаданные case от runtime payload.
Swift требует обработать каждый возможный case enum, чтобы switch всегда имел определённый поток выполнения.
- Перечисление всех cases позволяет compiler сообщить о пропущенной ветке при изменении собственного enum.
- default обрабатывает остаток, но может скрыть добавленные cases у enum приложения.
- @unknown default полезен для non-frozen системных enums, которые Apple может расширить в будущих SDK.
Зачем это спрашивают: Интервьюер проверяет связь exhaustive matching с безопасностью compiler и развитием API.
Argument labels формируют место вызова, parameter names используются внутри функции, а default values позволяют не передавать отдельные аргументы.
- В move(from start: Int, to end: Int) снаружи используются from и to, а в теле start и end.
- Подчёркивание убирает внешний label, если так вызов читается естественнее.
- Defaults должны выражать разумное частое поведение, а не скрывать важный выбор.
Зачем это спрашивают: Интервьюер оценивает умение читать и проектировать идиоматичные сигнатуры функций Swift.
Protocol определяет контракт свойств, методов, initializers и других возможностей, которые должен предоставить conforming type.
- Structs, classes и enums могут соответствовать protocols.
- Код может принимать protocol вместо одного конкретного типа, уменьшая связанность с реализацией.
- Protocols описывают требуемое поведение, но обычно сами не хранят данные экземпляра.
Зачем это спрашивают: Сильный ответ объясняет protocols как контракты для взаимозаменяемости разных типов Swift.
Protocol extension может дать общие default implementations и вспомогательное поведение conforming types.
- Conforming type получает default, если не предоставляет собственную реализацию.
- Требования, объявленные в protocol, могут динамически выполняться конкретной реализацией.
- Методы только из extension используют static dispatch при вызове через protocol-typed value, что отличает их от protocol requirements.
Зачем это спрашивают: Интервьюер проверяет базовое protocol-oriented переиспользование и различие dispatch для extension-only методов.
Extension добавляет методы, computed properties, protocol conformance и другое поддерживаемое поведение существующему типу.
- Он помогает организовать тип по ответственности без создания subclass.
- Extensions могут добавлять computed properties, но не stored instance properties.
- Тип из другого модуля может получить локальные удобства или conformance, если это разрешают правила доступа.
Зачем это спрашивают: Интервьюер оценивает организационную пользу extensions и ограничение на хранимые свойства.
Generics позволяют одной type-safe реализации работать с разными типами, сохраняя связи между ними.
- Generic function принимает T без преобразования в Any и обратного cast.
- Constraints вроде T: Equatable разрешают операции, гарантированные требуемым protocol.
- Collections Array<Element> и Dictionary<Key, Value> являются стандартными generic types.
Зачем это спрашивают: Сильный ответ связывает переиспользование кода с compile-time type safety и protocol constraints.
Equatable определяет равенство значений, а Hashable также предоставляет hash для sets и dictionary keys.
- Равные значения всегда должны давать одинаковый hash в рамках одного запуска.
- Hashable наследует Equatable, поэтому hashable type поддерживает обе операции.
- Swift синтезирует conformances, если все значимые stored properties соответствуют protocols и сгенерированный смысл верен.
Зачем это спрашивают: Интервьюер проверяет понимание равенства и хеширования как контрактов коллекций.
Array нужен для упорядоченных элементов, Set для уникального membership, а Dictionary для значений по уникальным ключам.
- Array сохраняет позицию и допускает дубликаты.
- Set быстро проверяет наличие, когда порядок и повторы не входят в модель.
- Dictionary связывает каждый Hashable key с одним value и возвращает optional при отсутствии ключа.
Зачем это спрашивают: Интервьюер оценивает соответствие коллекции требованиям порядка, уникальности и поиска.
Они по-разному преобразуют коллекцию без ручного построения результата в цикле.
- map преобразует каждый элемент, а filter оставляет элементы, соответствующие условию.
- compactMap преобразует элементы и удаляет nil-результаты.
- reduce объединяет последовательность в один накопленный результат, например сумму или сгруппированное значение.
Зачем это спрашивают: Сильный ответ различает форму результата и назначение каждой частой операции коллекций.
Closure является самостоятельным блоком исполняемого кода, который можно хранить, передавать и вызвать позже.
- Она может принимать параметры и возвращать значение подобно функции.
- Она захватывает константы и переменные окружающей области, сохраняя к ним доступ при вызове.
- Swift поддерживает shorthand arguments и trailing-closure syntax, но для нетривиальной логики понятные имена лучше.
Зачем это спрашивают: Интервьюер проверяет понимание closures как вызываемых значений с захваченным контекстом.
Закрытые вопросы
- 21
Чем escaping closure отличается от nonescaping?
closures - 22
Что делает capture list в Swift closure?
closuresswift - 23
Как работает обработка ошибок Swift через throws, try, do и catch?
error-handlingswift - 24
Что представляет тип Result в Swift?
swift - 25
Чем различаются уровни доступа Swift?
swift - 26
Чем различаются правила инициализации structs и classes?
swift - 27
Что такое Automatic Reference Counting в Swift?
swift - 28
Как два экземпляра классов могут создать strong reference cycle?
memory - 29
Когда ссылка должна быть weak, а когда unowned?
memory - 30
Как escaping closure может создать retain cycle с self?
closuresmemory - 31
Чем различаются UIKit и SwiftUI?
uikitswiftuiswift - 32
Что представляет property body у SwiftUI View?
swiftuiswift - 33
Каковы ключевые callbacks жизненного цикла UIViewController при появлении экрана?
callbacks - 34
Чем loadView отличается от viewDidLoad?
lifecycle - 35
Чем viewWillAppear и viewDidAppear отличаются от viewDidLoad?
lifecycle - 36
Какие роли выполняют AppDelegate и SceneDelegate в UIKit-приложении?
uikit - 37
Что такое Auto Layout и как он определяет frames views?
layout - 38
Чем ambiguous Auto Layout отличается от unsatisfiable?
layoutconfig - 39
Что такое intrinsic content size, content hugging и compression resistance?
autolayout - 40
Почему translatesAutoresizingMaskIntoConstraints обычно ставят в false для программного Auto Layout?
layout - 41
Какие обязанности нужны для отображения данных в UITableView?
uikit - 42
Зачем UITableView и UICollectionView переиспользуют cells?
uikit - 43
Чем UITableViewDataSource отличается от UITableViewDelegate?
uikit - 44
Когда UICollectionView предпочтительнее UITableView?
uikit - 45
Чем управляет layout object у UICollectionView?
uikit - 46
Как работает delegate pattern в iOS?
delegationprotocols - 47
Как UINavigationController управляет навигацией?
navigation - 48
Чем modal presentation отличается от push в navigation controller?
navigation - 49
Каковы компромиссы Storyboards и построения UIKit-экранов кодом?
uikit - 50
Для чего используются IBOutlet и IBAction в UIKit-экране со Storyboard?
uikit - 51
Как построить UIKit-экран, который загружает товары из API и показывает их?
uikitapi - 52
Экран списка может загружаться, быть пустым, завершиться ошибкой или содержать данные; как реализовать эти состояния?
- 53
Как реализовать переиспользование UITableViewCell без появления устаревшего содержимого?
uikitviews - 54
Как обновить таблицу после вставки и удаления элементов без invalid update errors?
- 55
Self-sizing cell таблицы обрезается или получает неверную высоту; как это исправить?
- 56
Как добавить пагинацию в UITableView, получающую данные из REST API?
restpaginationuikit - 57
Как построить сетку фотографий в две колонки с UICollectionView?
griduikitschema - 58
После прокрутки выбранное состояние появляется не у тех collection-view cells; как это исправить?
- 59
Как загружать remote images в reusable cells без мигания неправильных картинок?
- 60
Как добавить pull-to-refresh в список, который уже поддерживает пагинацию?
pagination - 61
Как реализовать GET request через URLSession и декодировать ответ?
networking - 62
Как отправить JSON POST request и обработать ответ?
- 63
URLSession request завершился, но UI иногда обновляется неправильно; как исправить работу с потоками?
networkingconcurrency - 64
Как отменять устаревший network request при изменении поискового запроса?
queries - 65
Как обрабатывать offline и временные ошибки на экране с данными API?
api - 66
Как тестировать API client на URLSession без обращения к настоящему серверу?
networkingapi - 67
Как добавлять authentication token к requests и не хранить его небезопасно?
authtokens - 68
Endpoint возвращает корректный JSON, но Decodable завершается ошибкой; как это отлаживать?
endpoints - 69
У view неоднозначный Auto Layout и она непредсказуемо перемещается; как это отлаживать?
layout - 70
Xcode пишет 'Unable to simultaneously satisfy constraints'; как найти конфликт?
autolayoutxcode - 71
Label обрезается, пока соседняя button расширяется; как настроить Auto Layout priorities?
layout - 72
Форма скрывается клавиатурой; как исправить layout?
forms - 73
Reusable table cell начинает выдавать constraint warnings только после прокрутки; как исследовать проблему?
autolayout - 74
Как сделать UIKit-экран адаптивным к rotation и Dynamic Type?
uikit - 75
Как выбрать между push нового экрана и modal presentation?
- 76
Как передать выбранный элемент из списка на detail screen?
- 77
Как modal edit screen должен вернуть сохранённое значение на presenting screen?
- 78
Как направить deep link на вложенный detail screen?
- 79
Как совместить tab bar с независимыми navigation flows?
navigationcombine - 80
Как реализовать value-driven navigation в SwiftUI?
swiftuinavigationswift - 81
View controller не деинициализируется после dismissal; как найти retain cycle?
uikitmemory - 82
Как исправить retain cycle, созданный escaping closure?
closuresmemory - 83
Экран фотографий получает memory warnings, а приложение завершается; что изменить сначала?
memory - 84
Приложение падает с 'index out of range'; как найти и исправить причину?
indexes - 85
Как по iOS crash report найти упавший код?
- 86
Completion handler обновляет label после dismissal экрана; как это исправить?
- 87
Как реализовать простой экран избранного с Core Data?
core-data - 88
Импорт Core Data замораживает scrolling; как безопасно перенести его с main thread?
core-dataconcurrency - 89
Поиск на Combine запускает duplicate requests и не освобождает subscriptions; как это исправить?
combine - 90
Как структурировать небольшую MVVM-фичу, загружающую профиль пользователя?
architecture-patternsswift - 91
Как реализовать validation для sign-up form?
formsvalidation - 92
Как добавить выбор фотографии из библиотеки и обработать отказ в permission?
- 93
Как сделать custom product cell доступной?
- 94
Как unit-test асинхронно загружающую данные view model?
asyncconcurrencyhypothesis-testing - 95
Как написать надёжный UI test для добавления элемента в избранное?
- 96
Как сохранить незавершённый draft при переходе приложения в background?
- 97
Как безопасно добавить сторонний package через Swift Package Manager?
npmdependenciesdependency-management - 98
Как вызвать существующую Objective-C utility из нового Swift-кода?
swift - 99
Таблица дёргается при scrolling; как найти и устранить bottleneck?
tracking - 100
Как реализовать offline-capable favorite button на product detail screen?