HR-блог про IT рекрутинг от ИТ Кадрового агентства

30 лучших вопросов для интервью с разработчиками iOS, которые нужно задать программистам Swift и Objective-C

Вопросы для собеседования
Приложения для iOS — это мощный способ выделиться среди конкурентов, повысить узнаваемость бренда и установить связь с пользователями на более глубоком личном уровне. По статистике, мобильные пользователи тратят 50% своего времени на приложения, поэтому инвестиции в создание мобильного продукта разумны.
С другой стороны , по статистике каждый месяц выпускается более 30 000 новых приложений для iOS. Чтобы пробиться сквозь стену конкуренции, владельцу бизнеса необходимо нанять опытных разработчиков iOS.
В этом посте мы подробно рассмотрим вопросы собеседования по ios, которые вы можете задать кандидату на вакансию программиста.

20 вопросов для интервью iOS-разработчика Objective-C

Вот технические вопросы, которые вы можете задать, чтобы узнать, может ли кандидат обеспечить качество кода, соответствующее зарплате разработчика iOS, которую предлагает ваша компания.
Вопрос №1: Разработчики Objective-C обычно используют протоколы. Определить протокол
Ответ: В Objective-C протокол — это способ объявить интерфейс для класса. Благодаря протоколам разработчики могут связать два удаленных класса друг с другом, чтобы приложение выполняло свои функции.
Вопрос 2. Какие типы протоколов существуют?
Ответ : протоколы бывают двух видов — формальные и неформальные.
  • При неформальном протоколе большинство объектов становятся приверженцами протокола. По определению неформальный протокол является категорией NSObject. При работе с таким протоколом разработчику не нужно использовать методы. До выпуска Objective-C 2.0 разработчикам необходимо было использовать неформальные протоколы при работе с AppKit и Foundation. Однако после выпуска 2.0 были введены необязательные методы — это означало, что программистам больше не приходилось полагаться на неформальные протоколы для реализации делегирования в классах AppKit и Foundation.
  • Формальный протокол ограничивает клиентский класс определенным диапазоном методов. Формальные протоколы имеют собственный синтаксис для проверки типов, принятия или объявления. Есть необязательные методы и для формальных протоколов — разработчики могут вызывать их с помощью ключевого слова @Optional. После объявления формального протокола все подклассы класса-предка также будут наследовать протокол.
Вопрос №3. В чем разница между ключевыми словами #include и #import в Objective-C?
Ответ . Как правило, разработчики предпочитают #import вместо include. Чтобы понять причину, давайте посмотрим на разницу между ними:
  • # import гарантирует, что прикрепленный файл не будет повторно включен в препроцессор.
  • #include , с другой стороны, поддерживает добавление одного и того же файла нескольких типов.
Избегание рекурсивного включения — одна из лучших практик разработки на Objective-C — вот почему #import обычно используется вместо #include.
Здесь кандидат должен быть осторожен, чтобы не спутать Objective-C и C (в последнем использование #include является более распространенной практикой).
Вопрос №4. Определить #import в Objective-C?
Ответ : # Импорт — это ключевое слово, которое предотвращает включение файла в приложение более одного раза.
Вопрос №5. Как категории используются в Objective-C?
Ответ : В Objective-C категория используется для добавления новых методов в класс (с их помощью, например, разработчики добавляют методы в фреймворки Cocoa). Когда метод добавляется с использованием категорий, все подклассы также наследуют этот набор методов.
Давайте рассмотрим несколько практических применений категории:
  • Разделение исходных файлов путем распространения реализации класса.
  • Сортировка между методами в большом классе.
  • Объявление приватных методов.
Вопрос №6. Каковы плюсы и минусы использования категорий в Objective-C?
Ответ : При использовании категорий разработчикам необходимо знать об их преимуществах и ограничениях. Давайте посмотрим на преимущества и недостатки категорий Objective-C:
Преимущества :
  • Позволяет расширение любого класса, даже без исходного кода.
  • Надежный способ структурировать код и улучшить его читаемость.
  • Широко используется для реализации расширений пользовательского интерфейса.
Недостатки : категория никоим образом не может переопределить методы, определенные другой категорией.
Вопрос №7. Кратко объясните концепцию быстрого перечисления.
Ответ : по определению, быстрое перечисление облегчает процесс перечисления (упоминания объектов, которые оно включает, один за другим) коллекции.
При работе с быстрым перечислением разработчик видит объект как коллекцию (будь то набор или массив). Быстрое перечисление помогает разработчикам извлекать элементы, удерживаемые экземпляром. Протокол NSFastEnumeration аналогичен концепции циклов в C.
Вопрос №8. В чем разница между NSMutableArray и NSArray? Какой из них следует использовать разработчикам?
  • NSArray создает статические (неизменяемые) массивы.
  • NSMutableArray , с другой стороны, создает динамические (изменяемые) массивы.
Хотя возможность изменять массив удобна, стоит отметить, что NSMutableArray медленнее, чем NSArray , и не является потокобезопасным.
Вопрос №9. Какова цель использования @synthesize в Objective-C?
Ответ : @synthesize — ключевое слово, определяющее геттер-сеттер для выбранной переменной. Разработчики используют его для добавления новых атрибутов к переменным и автоматического создания геттера и сеттера.
Вопрос №10. Объясните назначение точечной записи в Objective-C.
Ответ : разработчики используют такой способ обозначения (например, abc.length) для удобства чтения при установке геттеров и сеттеров для переменных.
По существу, абв. length такой же, как abs .setLength= , но его легче читать.
Вопрос №11. Как разработчик вызывает функцию в Objective-C?
Ответ : Для вызова метода программист использует следующий синтаксис:
className имя_метода
Вопрос №12. В чем разница между атомарными и неатомарными свойствами в Objective-C?
Ответ : практически говоря, атомарное свойство выполняется медленнее, чем неатомарное.
Это связано с тем, что атомарные свойства (по умолчанию) обеспечивают полное завершение процессов.
С другой стороны, неатомарные свойства работают быстрее, поскольку не требуют полного завершения процесса. Хотя это более быстрый тип поведения, поскольку они не являются потокобезопасными, неатомарные свойства не используются по умолчанию.
Вопрос №13. Что означают КВО и КВД? Объясните оба понятия
Ответ :
  • KVC (сокращение от Key-Value-Coding) используется, когда разработчик хочет получить доступ к свойству с помощью строки.
  • KVO (сокращение от Key-Value-Observing) позволяет наблюдать за изменениями свойств или значений. Чтобы иметь возможность отслеживать изменения, разработчикам необходимо определить значение в виде строки. Таким образом, чтобы иметь право на наблюдение, значение должно соответствовать кодированию значения ключа.
Вопрос №14. Опишите значение GrandCentralDispatch
Ответ : GCD — это способ ставить в очередь и выполнять задачи как синхронно, так и асинхронно. GrandCentralDispatch — универсальный инструмент, который разработчики могут применять для решения большинства задач без написания многопоточного кода.
Вопрос №15. Описать блоки в Objective-C
Ответ : блоки — это общая функция C++, Objective-C и C. Она позволяет разработчикам создавать несколько сегментов кода и присоединять их к функциям или методам как отдельные значения. Блок легко определить в фрагменте кода — он должен начинаться с символа вставки (^).
Вопрос №16. Определить идентификатор
Ответ : в Objective-C id используется как указатель на тип данных. Разница между * и id заключается в том, что id может указывать только на объекты Objective-C, а * не имеет такого ограничения.
Вопрос №17. Определить цепочки ответчиков
Ответ : Несколько объектов респондента, связанных вместе, образуют цепочку респондента. Такая цепочка начинается с первого откликнувшегося и заканчивается объектом. Если первый респондент не может обработать событие, он передает действие следующему респонденту в серии.
Вопрос №18. Есть ли разница между id и InstanceType?
Ответ : да, есть.
  • Instancetype — это ключевое слово типа результата, которое используется для возврата методов.
  • Id , с другой стороны, является общим объектом.
Как правило, разработчики предпочитают использовать instancetype при возврате результатов метода, а не id.
Вопрос №19. Поддерживает ли Objective-C перегрузку функций?
Ответ : на данный момент в Objective-C нет перегрузки методов. Вот почему разработчики должны называть методы по-разному.
Вопрос №20. Охарактеризуйте понятие делегирования.
Ответ : в Objective-C делегат — это объект, который выполняет действия вместо другого объекта. Разработчики могут либо сохранить делегатов, либо оставить их такими, какие они есть. Создание слишком большого количества циклов сохранения не рекомендуется в Objective-C.

15 вопросов для интервью с разработчиком Swift iOS для разработчиков программного обеспечения

Вот несколько вопросов для собеседования по Swift базового и среднего уровня, которые вы можете задать или отправить внештатному разработчику iOS .
Вопрос 1. Дайте определение Swift и опишите основные преимущества языка.
Ответ : Swift — это язык программирования общего назначения с несколькими парадигмами и свойствами времени компиляции. Он использовался для создания продуктов для iOS, macOS, tvOS, watchOS, а также Linux.
Основные преимущества Swift:
  • Читаемый код благодаря лаконичному, легко читаемому синтаксису языка.
  • Содействие безопасности — Swift делает модульное тестирование и исправление ошибок при написании кода простым и быстрым процессом.
  • Высокая ремонтопригодность — код Swift обычно не оставляет после себя большого наследия.
  • Открытый исходный код способствует инновациям.
  • Высокая скорость работы — поскольку Swift опирается на компилятор LLVM, весь языковой код трансформируется в нативный формат. В сочетании с кратким синтаксисом эта функция позволяет приложениям Swift работать быстрее, чем их аналоги на Objective-C.
Вопрос 2. В чем разница между структурами и классами в Swift?
Вопрос №3. Когда разработчику следует использовать классы и структуры?

Ответ : есть ситуации, когда требуются классы и случаи, когда лучше использовать структуру. Рассмотрим их поближе:

  • Разработчики используют структуры для копирования инкапсулированных значений при передаче экземпляра структуры.
  • Если разработчик хочет использовать наследование, он должен определить класс. На самом деле, использование классов вместо структур — стандартная практика разработки Swift.

Вопрос №4. Описывать модули в Swift.
Ответ : по определению модуль — это единица, в которой распространяется код Swift. В Swift модули также могут реализовывать фреймворки или приложения. Кроме того, в Swift цели, созданные Xcode, рассматриваются как отдельные модули.
Вопрос №5. Как разработчик может передавать переменные в качестве ссылок в Swift?
Ответ : чтобы преобразовать переменную в ссылку, программисты обычно используют inout. Параметр позволяет изменять как локальную переменную, так и передаваемые ей параметры.
Вопрос №6. Описать типы уровней доступа.
Ответ : в Swift есть 5 типов уровней доступа.
  • Классы открытого доступа могут стать частью подкласса. Другой модуль также может переопределить такой класс.
  • Классы общего доступа могут быть превращены в подклассы или переопределены только модулем, который их определяет.
  • Объекты внутреннего доступа могут использоваться только как часть исходного файла модуля, который их определяет, а не другой.
  • Использование данных доступа к файлам ограничено только исходным файлом, который их определяет.
  • Настройка закрытого доступа не позволяет использовать сущности для включения объявлений или расширений объявлений.
Вопрос №7. Что такое ленивая инициализация в Swift?
Ответ : это метод, используемый для отсрочки запуска ресурсоемкого процесса или объявления объекта. Разработчики могут применять ленивую инициализацию только к классам и структурам. Чтобы подготовить свойство к инициализации, программисту необходимо использовать ключевое слово var.
Кроме того, кандидат должен упомянуть, что отложенная инициализация не является свойством потокобезопасности.
Вопрос №8. Определите кортеж.
Ответ : кортеж — это ряд значений, воспринимаемых системой как одно значение. В Swift кортежи обычно используются для возврата вызовов функций с несколькими значениями.
Существует два типа кортежей: именованные и безымянные (когда имена включаемых в него элементов не указаны).
Вопрос №9. Определите необязательный элемент в Swift и опишите варианты его использования.
Ответ : по определению необязательный — это тип данных, который может содержать значение или оставаться пустым. Чтобы добавить необязательный элемент к типу данных, разработчик добавляет «?» к типу данных.
Обычно разработчики добавляют option в двух случаях — если их выполнение ненадежно и если option не нужен сейчас, но может пригодиться позже.
Вопрос №10. Описать необязательную цепочку
Ответ : определение необязательной цепочки — это процесс вызова индекса, свойства, метода, а также запрос необязательного, который может содержать «ноль».
В зависимости от значения необязательного параметра системный возврат может быть либо значением, либо нулем.

Наймите опытных разработчиков iOS в команду с IT and Digital

Мы - ИТ кадровое агентство, которое поможет вам найти IOS разработчиков за менее чем 2 недели. Свяжитесь с нами уже сегодня, чтобы узнать, как мы можем помочь масштабировать ваш следующий проект. Мы гарантируем поиск самого сильного кандидата, а не самого дорогого. За 10 лет мы закрыли более 5500 вакансий и собрали более 25 команд с нуля. Вы можете ознакомиться с отзывами наших клиентов о нашем рекрутинговом агентстве. Если вам нужны дополнительные референсы, напишите нам в Telegram.