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

0
74
views

Сайт tproger.ru собрал вопросы и задания, которые часто встречаются на собеседованиях iOS разработчиков.

Вопросы для iOS разработчиков

Optional

Что такое optional? Какие способы развернуть optional вы знаете? Что такое неявно развёрнутый optional?

Тип optional в Swift — это enum, который может иметь одно из двух значений: None или Some(T), где T — это любой тип данных. С его помощью можно обезопасить себя от попытки доступа к nil значению.

Существует несколько способов развернуть optional.

  1. Проверка на nil:
let a: String? = "string"
if a != nil {
    print(a!)
} else {
    print("Error")
}

2. Guard let:

guard let a = a else { return }

3. If let:

if let a = a {
    print(a)
} else {
    print("Error")

4. Force unwrapping — это небезопасный способ, если значение равно nil, программа завершится:

print(a!)

5. Nil coalescing:

print(a ?? "Error")

6. Optional chaining:

print(a?.uppercased())

Также optional используется в приведении типов:

let b = (a as? Int) // b будет равно nil, если a нельзя преобразовать в Int
let b = (a as! Int) //если а нельзя преобразовать в Int, программа завершится

И в обработке ошибок:

enum CountError: Error {
    case invalidCount
}

func setCount(_ count: Int) throws
{
    if count <= 0 {
        throw CountError.invalidCount
    }

    // Do things with speed
}

if let success = try? setCount(5) {
    print("Setting speed was successful!")
}
let fail = try! setCount // аналогично force unwrapping

Многопоточность

Об этом можно прочитать в статье про GCD и Dispatch Queues.

Отличия frame и bounds

Это один из любимых вопросов на iOS собеседованиях. Отсчёт координат прямоугольника bounds ведется от его системы координат, а координаты frame считаются от контейнера в котором он находится (superview).

Паттерны программирования

У нас если серия переводов статей о паттернах простым языком.

Отличия структуры от класса

Структуры:

  • ссылочный тип;
  • имеют поэлементные инициализаторы.

Классы:

  • значимый тип;
  • могут наследоваться;

Weak ссылки

Когда нужно использовать слабые ссылки? Чем weak отличается от unowned?

Слабые ссылки используют, когда объект, на момент обращения к ссылке может не существовать. Например, при обращении к self из замыкания:

let closure = { [weak self] in 
    self?.doSomething() //weak ссылки — это optional
}

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 будет быстрее, потому что множества, как и словари, используют хэши.

Анимация

Гайд по анимации в iOS.

Инструменты XCode

Читайте об инструментах в статье про Time Profiler и Allocations.

Ключевое слово defer

C помощью defer мы можем выполнить блок кода безусловно, перед тем как закончится его область видимости. Например:

func readFile(file) {
    let file = openFile(file) 
    defer { closeFile(file) }//код в блоке defer выполнится перед return, когда бы он не сработал
guard let openedFile = file else { return }
}

Хранение данных в iOS

Статья о том, как хранить данные локально.

Git, merge conflict

В этом вам поможет статья о безболезненном разрешении merge конфликтов.

Алгоритмы

Читайте статью об алгоритмах и сложности алгоритмов.

Задачи для iOS разработчиков

Задачи из списка полезно сделать заранее и выложить на GitHub. Зачастую такие задания предлагают сделать перед iOS собеседованием. Наличие готового варианта сэкономит ваше время.

  1. Приложение с авторизацией для любого публичного API.
  2. Приложение со списком задач: задания хранятся локально, реализовать редактирование, добавление картинок.
  3. Простой Instagram: реализовать получение списка картинок из любого публичного API. Картинки должны загружаться по мере скролла страницы. При нажатии на картинку она открывается на весь экран. Также необходимо использовать кэширование, чтобы при отсутствии интернета картинки продолжали отображаться.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here