Какова иерархия наследования класса UIView в UIKit?

«Какова иерархия наследования класса UIView в UIKit?» — вопрос из категории UIKit, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

UIView наследуется от UIResponder. UIResponder, в свою очередь, является подклассом NSObject — корневого класса большинства иерархий в Objective-C и Cocoa Touch.

Полная цепочка наследования:

NSObject → UIResponder → UIView

Роль каждого класса в иерархии:

  1. NSObject:

    • Предоставляет базовую функциональность Objective-C runtime.
    • Реализует протокол NSObjectProtocol (например, методы isEqual(_:), hash, description).
    • Поддерживает Key-Value Observing (KVO) и Key-Value Coding (KVC).
  2. UIResponder:

    • Базовый класс для всех объектов, обрабатывающих события.
    • Определяет интерфейс для работы с цепочкой ответчиков (Responder Chain).
    • Обрабатывает события касания (touchesBegan(_:with:)), движения, нажатия кнопок, встряхивания устройства, а также события удаленного управления (например, наушников).
    • От UIResponder также наследуются UIViewController, UIApplication и UIWindow.
  3. UIView:

    • Наследуя от UIResponder, получает способность обрабатывать события.
    • Добавляет функциональность для отображения и компоновки на экране: геометрия (frame, bounds), иерархия вью (addSubview), отрисовка (draw(_:)), анимация, Auto Layout.

Пример создания кастомной вью:

class CustomView: UIView {
    // Наследует все возможности UIView и UIResponder
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupView()
    }

    // Можно переопределить методы UIResponder для кастомной обработки событий
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        print("CustomView получил касание")
        // Кастомная логика
    }
}

Практический вывод: Поскольку UIView — это UIResponder, любая вью по умолчанию может стать первым обработчиком событий касания в своей области экрана, если не перехватывается другими объектами (например, кнопками).