Собеседование iOS разработчика: вопросы и задания
Собрали для вас самые часто используемые вопросы и задания, которые дают iOS разработчикам на собеседованиях.
33К открытий34К показов
В этой статье мы собрали вопросы и задания, которые часто встречаются на собеседованиях iOS разработчиков.
Вопросы для iOS разработчиков
Optional
Что такое optional? Какие способы развернуть optional вы знаете? Что такое неявно развёрнутый optional?
Тип optional в Swift — это enum, который может иметь одно из двух значений: None или Some(T), где T — это любой тип данных. С его помощью можно обезопасить себя от попытки доступа к nil значению.
Существует несколько способов развернуть optional.
- Проверка на nil:let a: String? = "string"if a != nil { print(a!)} else { print("Error")}Guard let:guard let a = a else { return }If let:if let a = a { print(a)} else { print("Error")Force unwrapping — это небезопасный способ, если значение равно nil, программа завершится:print(a!)Nil coalescing:print(a ?? "Error")Optional chaining:print(a?.uppercased())
Также optional используется в приведении типов:
И в обработке ошибок:
Многопоточность
Об этом можно прочитать в статье про GCD и Dispatch Queues.
Отличия frame и bounds
Это один из любимых вопросов на iOS собеседованиях. Отсчёт координат прямоугольника bounds ведется от его системы координат, а координаты frame считаются от контейнера в котором он находится (superview).
Паттерны программирования
У нас если серия переводов статей о паттернах простым языком.
Отличия структуры от класса
Структуры:
- значимый тип;
- имеют поэлементные инициализаторы.
Классы:
- ссылочный тип;
- могут наследоваться;
Weak ссылки
Когда нужно использовать слабые ссылки? Чем weak отличается от unowned?
Слабые ссылки используют, когда объект, на момент обращения к ссылке может не существовать. Например, при обращении к self из замыкания:
Weak ссылки, как и unowned, не увеличивают счётчик ссылок. Отличие unowned в том, что он не является optional. Weak используется когда известно, что ссылка может быть nil. Unowned — если мы знаем что ссылка никогда не будет nil.
Цикл жизни приложения
- Не запущено: приложение не запускалось или было завершено системой.
- Не активно: приложение запущено, но в данный момент не реагирует на события (Но может выполнять код). Обычно это состояние длится не долго и является промежуточным.
- Активно: приложение запущено и реагирует на события.
- В фоне: приложение выполняется в фоне. Большинство приложений оказываются в этом состоянии не на долго, перед тем как быть приостановленными. Однако, приложение запросившее дополнительное время в фоне, может находиться в этом состоянии некоторое время. Некоторые приложения могут работать в фоне большую часть времени.
- Приостановлено: приложение в фоне и не выполняет код. Система переводит приложения в это состояние автоматически, без предварительного уведомления. В этом состоянии приложение всё ещё находится в памяти, но не может выполнять код. При возникновении недостатка памяти система может очистить приостановленные приложения без предварительного уведомления, чтобы освободить больше места для активных предложений.
Жизненный цикл ViewController
- loadView: используется когда контроллер создаётся в коде. loadView вызывается контроллером, когда его текущий view равен nil.
- viewDidLoad: вызывается один раз за жизнь контроллера. Метод отрабатывает когда все view загружены.
- viewDidLayoutSubviews: вызывается когда любой view изменяется.
- viewDidAppear: вызывается когда view появляется на экране.
- viewDidDisappear: вызывается когда view контроллера удален.
Модификаторы доступа
- public и open — open позволяет наследовать и перегружать классы и члены классов внутри и вне модуля. public — только внутри модуля.
- internal — доступ в пределах модуля.
- fileprivate — доступ в пределах файла.
- private — доступ в пределах сущности, где определён объект.
Что работает быстрее — поиск по NSArray или NSSet?
Поиск по NSSet будет быстрее, потому что множества, как и словари, используют хэши.
Анимация
Инструменты XCode
Читайте об инструментах в статье про Time Profiler и Allocations.
Ключевое слово defer
C помощью defer мы можем выполнить блок кода безусловно, перед тем как закончится его область видимости. Например:
Хранение данных в iOS
Статья о том, как хранить данные локально.
Git, merge conflict
В этом вам поможет статья о безболезненном разрешении merge конфликтов.
Алгоритмы
Читайте нашу статью об алгоритмах и сложности алгоритмов.
Задачи для iOS разработчиков
Задачи из списка полезно сделать заранее и выложить на GitHub. Зачастую такие задания предлагают сделать перед iOS собеседованием. Наличие готового варианта сэкономит ваше время.
- Приложение с авторизацией для любого публичного API.
- Приложение со списком задач: задания хранятся локально, реализовать редактирование, добавление картинок.
- Простой Instagram: реализовать получение списка картинок из любого публичного API. Картинки должны загружаться по мере скролла страницы. При нажатии на картинку она открывается на весь экран. Также необходимо использовать кэширование, чтобы при отсутствии интернета картинки продолжали отображаться.
33К открытий34К показов