Skip to content

Вопросы на собеседовании: iOS-разработчик

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.

Смотреть пример резюме: iOS-разработчик

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

swift

let объявляет константу без возможности повторного присваивания, а var объявляет значение, которое можно менять.

  • По умолчанию лучше выбирать let, поскольку он явно показывает намерение сохранить значение неизменным.
  • Ссылка let на экземпляр класса не может указывать на другой объект, но изменяемые свойства самого объекта всё ещё можно менять.
  • У struct в let нельзя менять переменные свойства, поскольку всё значение является константой.

Зачем это спрашивают: Интервьюер проверяет понимание правил присваивания и влияния value и reference semantics.

swift

Swift обычно выводит тип переменной из начального значения, а аннотация напрямую задаёт требуемый тип.

  • let count = 3 получает тип Int, а let price: Double = 3 явно запрашивает Double.
  • Аннотация полезна, когда нужный protocol, числовой тип или optionality неочевидны из initializer.
  • Swift остаётся статически типизированным, поэтому переменная с выведенным типом не сможет позже хранить несвязанный тип.

Зачем это спрашивают: Сильный ответ отличает компактный вывод типа от динамической типизации и объясняет пользу аннотаций.

swift

Optional представляет либо обёрнутое значение определённого типа, либо отсутствие значения как nil.

  • String? является сокращением для Optional<String> и не используется как обычный String без обработки nil.
  • Optionals делают отсутствие данных частью системы типов вместо специальных условных значений.
  • Частые источники включают неудачный поиск, отсутствующий ввод и API, где результата может не быть.

Зачем это спрашивают: Интервьюер оценивает понимание nil как явного состояния типа, а не обычного значения любого типа.

swift

Optional следует распаковывать через optional binding, guard, optional chaining или оправданное значение по умолчанию.

  • if let обрабатывает значение внутри одной ветки, а guard let рано выходит и оставляет распакованное значение доступным дальше.
  • Оператор nil-coalescing задаёт fallback, а optional chaining продолжает цепочку только при наличии значения.
  • Force unwrap через ! допустим лишь при настоящей гарантии значения, поскольку nil приведёт к runtime crash.

Зачем это спрашивают: Сильный ответ показывает несколько безопасных инструментов и считает force unwrap исключением с гарантированной инвариантой.

swift

guard полезен для ранней проверки обязательных условий и уменьшает вложенность основного успешного пути.

  • Ветка guard обязана передать управление через return, throw, break или continue при невыполненном условии.
  • Значения из guard let остаются доступными в остальной части текущей области.
  • Он подходит для обязательных предусловий, а if понятнее, когда обе ветки являются обычными вариантами.

Зачем это спрашивают: Интервьюер проверяет выбор управления потоком по семантике раннего выхода, а не только по стилю.

swift

Optional chaining безопасно проходит по свойствам и методам optional, а nil coalescing задаёт fallback, если результат равен nil.

  • user.profile?.displayName возвращает optional, поскольку любое optional-звено может отсутствовать.
  • Добавление ?? "Guest" преобразует отсутствующий результат в неoptional значение для отображения.
  • Цепочка убирает глубокую вложенность binding, когда операция должна продолжаться только для существующих значений.

Зачем это спрашивают: Интервьюер оценивает безопасный доступ и осознанный fallback без force unwrap.

swift

Struct является value type, а class является reference type с идентичностью, наследованием и deinitialization.

  • Присваивание или передача struct создаёт логически независимое значение через copy semantics.
  • Присваивание экземпляра class копирует ссылку, поэтому несколько переменных видят изменения одного объекта.
  • Struct предпочтителен для простых моделей данных, а class нужен при общей идентичности или class-only поведении.

Зачем это спрашивают: Сильный ответ связывает возможности языка с владением и моделированием, а не только перечисляет синтаксис.

swift

Value semantics дают каждой переменной своё логическое значение, а reference semantics позволяют переменным разделять один экземпляр объекта.

  • Swift structs, enums, arrays и dictionaries используют value semantics.
  • Экземпляры классов используют reference semantics, поэтому изменение через одну ссылку видно через остальные.
  • Value semantics уменьшают случайное общее изменение, а reference semantics полезны при важной идентичности объекта.

Зачем это спрашивают: Интервьюер проверяет, может ли кандидат предсказать результат присваивания и изменения частых типов Swift.

swift

Методу struct нужен mutating, когда он меняет stored property или заменяет self.

  • Методы экземпляра value type по умолчанию являются nonmutating.
  • Keyword явно сообщает, что вызов может создать изменённое значение.
  • Метод всё равно не сможет изменить экземпляр, хранящийся в константе let.

Зачем это спрашивают: Интервьюер оценивает понимание правил изменения value types.

swift

Raw value является заранее заданной константой case, а associated values несут данные конкретного экземпляра enum.

  • Raw values имеют один общий тип вроде String или Int и могут поддерживать инициализацию из него.
  • Associated values могут иметь разные типы и labels для разных cases.
  • Switch извлекает associated data через pattern matching, поэтому enums подходят для состояний с разной нагрузкой.

Зачем это спрашивают: Сильный ответ отличает постоянные метаданные case от runtime payload.

swift

Swift требует обработать каждый возможный case enum, чтобы switch всегда имел определённый поток выполнения.

  • Перечисление всех cases позволяет compiler сообщить о пропущенной ветке при изменении собственного enum.
  • default обрабатывает остаток, но может скрыть добавленные cases у enum приложения.
  • @unknown default полезен для non-frozen системных enums, которые Apple может расширить в будущих SDK.

Зачем это спрашивают: Интервьюер проверяет связь exhaustive matching с безопасностью compiler и развитием API.

swift

Argument labels формируют место вызова, parameter names используются внутри функции, а default values позволяют не передавать отдельные аргументы.

  • В move(from start: Int, to end: Int) снаружи используются from и to, а в теле start и end.
  • Подчёркивание убирает внешний label, если так вызов читается естественнее.
  • Defaults должны выражать разумное частое поведение, а не скрывать важный выбор.

Зачем это спрашивают: Интервьюер оценивает умение читать и проектировать идиоматичные сигнатуры функций Swift.

typingswiftprotocols

Protocol определяет контракт свойств, методов, initializers и других возможностей, которые должен предоставить conforming type.

  • Structs, classes и enums могут соответствовать protocols.
  • Код может принимать protocol вместо одного конкретного типа, уменьшая связанность с реализацией.
  • Protocols описывают требуемое поведение, но обычно сами не хранят данные экземпляра.

Зачем это спрашивают: Сильный ответ объясняет protocols как контракты для взаимозаменяемости разных типов Swift.

typingprotocols

Protocol extension может дать общие default implementations и вспомогательное поведение conforming types.

  • Conforming type получает default, если не предоставляет собственную реализацию.
  • Требования, объявленные в protocol, могут динамически выполняться конкретной реализацией.
  • Методы только из extension используют static dispatch при вызове через protocol-typed value, что отличает их от protocol requirements.

Зачем это спрашивают: Интервьюер проверяет базовое protocol-oriented переиспользование и различие dispatch для extension-only методов.

swift

Extension добавляет методы, computed properties, protocol conformance и другое поддерживаемое поведение существующему типу.

  • Он помогает организовать тип по ответственности без создания subclass.
  • Extensions могут добавлять computed properties, но не stored instance properties.
  • Тип из другого модуля может получить локальные удобства или conformance, если это разрешают правила доступа.

Зачем это спрашивают: Интервьюер оценивает организационную пользу extensions и ограничение на хранимые свойства.

genericsswift

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.

protocols

Equatable определяет равенство значений, а Hashable также предоставляет hash для sets и dictionary keys.

  • Равные значения всегда должны давать одинаковый hash в рамках одного запуска.
  • Hashable наследует Equatable, поэтому hashable type поддерживает обе операции.
  • Swift синтезирует conformances, если все значимые stored properties соответствуют protocols и сгенерированный смысл верен.

Зачем это спрашивают: Интервьюер проверяет понимание равенства и хеширования как контрактов коллекций.

swift

Array нужен для упорядоченных элементов, Set для уникального membership, а Dictionary для значений по уникальным ключам.

  • Array сохраняет позицию и допускает дубликаты.
  • Set быстро проверяет наличие, когда порядок и повторы не входят в модель.
  • Dictionary связывает каждый Hashable key с одним value и возвращает optional при отсутствии ключа.

Зачем это спрашивают: Интервьюер оценивает соответствие коллекции требованиям порядка, уникальности и поиска.

arrays

Они по-разному преобразуют коллекцию без ручного построения результата в цикле.

  • map преобразует каждый элемент, а filter оставляет элементы, соответствующие условию.
  • compactMap преобразует элементы и удаляет nil-результаты.
  • reduce объединяет последовательность в один накопленный результат, например сумму или сгруппированное значение.

Зачем это спрашивают: Сильный ответ различает форму результата и назначение каждой частой операции коллекций.

closuresswift

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?