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

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

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