Ответ
UIButton наследуется от UIControl, который, в свою очередь, наследуется от UIView. Полная цепочка наследования выглядит так:
NSObject → UIResponder → UIView → UIControl → UIButton
Что это означает на практике:
-
От
UIView:UIButtonполучает все свойства и методы для отображения на экране:frame,bounds,backgroundColoraddSubview(_:),removeFromSuperview()- Система Auto Layout (
translatesAutoresizingMaskIntoConstraints).
-
От
UIControl:UIButtonнаследует механизм Target-Action для обработки событий и управление состояниями:addTarget(_:action:for:)- Свойство
isEnabled - Состояния:
.normal,.highlighted,.disabled,.selected.
-
От
UIResponder: Возможность участвовать в цепочке ответчиков (responder chain) для обработки событий касания, встряхивания и т.д. -
От
NSObject: Базовая функциональность Objective-C runtime (например, KVO).
Пример проверки иерархии:
let button = UIButton()
// Проверка с помощью isKind(of:)
print(button.isKind(of: UIControl.self)) // true
print(button.isKind(of: UIView.self)) // true
print(button.isKind(of: UIResponder.self)) // true
// Вывод имени класса предка
print(type(of: button).superclass()) // Optional(UIControl)
print(UIControl.superclass()) // Optional(UIView)
Почему это важно? Понимание иерархии позволяет:
- Предсказывать, какие методы и свойства доступны у
UIButton. - Создавать кастомные кнопки, правильно переопределяя методы (например,
touchesBeganизUIResponderилиbeginTrackingизUIControl). - Эффективно использовать полиморфизм, работая с кнопкой как с
UIViewилиUIControl.