Ответ
В iOS для обработки пользовательского ввода (тапов, жестов) используются не классические структуры данных, а паттерны и API фреймворка UIKit, главные из которых:
-
Target-Action (Цель-Действие) с
UIControl:UIControl(например,UIButton,UISwitch) — это абстрактный суперкласс для элементов, генерирующих события.- Паттерн связывает событие элемента (
event) с методом цели (target) через селектор (action).let button = UIButton(type: .system) button.setTitle("Нажми", for: .normal) // Регистрация обработчика по паттерну Target-Action button.addTarget(self, action: #selector(handleButtonTap), for: .touchUpInside)
@objc func handleButtonTap() { print("Кнопка нажата!") }
-
UIGestureRecognizer(Распознаватели жестов):- Отдельные объекты (
UITapGestureRecognizer,UIPanGestureRecognizerи др.), которые можно прикрепить к любомуUIView. - Более гибкий подход для сложных жестов (свайп, пинч, долгое нажатие).
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleViewTap)) tapRecognizer.numberOfTapsRequired = 2 // Двойное нажатие myView.addGestureRecognizer(tapRecognizer)
@objc func handleViewTap(sender: UITapGestureRecognizer) { let location = sender.location(in: myView) print("Двойное нажатие в точке: (location)") }
- Отдельные объекты (
Почему именно эти подходы? Они интегрированы в цепочку ответов (Responder Chain). Событие сначала пытается обработаться распознавателем жестов или UIControl. Если они не обрабатывают его, событие передается вверх по цепочке ответчиков (UIResponder).
Для реактивного программирования можно использовать фреймворки вроде Combine или RxSwift, где поток событий представляется как наблюдаемая последовательность данных.