Ответ
Signal — это специализированный тип наблюдаемой последовательности в RxSwift, предназначенный для моделирования UI-событий. Его ключевые особенности:
- Не может завершиться с ошибкой — никогда не эмитит событие
.error, что критично для UI, где сбои должны обрабатываться иначе. - Гарантированная доставка на главном потоке — все события (
.next,.completed) доставляются подписчику наMainScheduler. - Нет реиграния при подписке — как и
Driver, не реиграет последнее событие новым подписчикам (являетсяhotobservable).
Практическое применение: Идеален для привязки действий пользователя (тапы, жесты) к реактивной логике.
// Создание Signal из UIControl
let buttonTapSignal: Signal<Void> = button.rx.tap.asSignal()
// Подписка
buttonTapSignal.emit(onNext: { [weak self] in
self?.handleButtonTap()
})
// Ошибка компиляции: Signal не имеет метода `.catchError`
// buttonTapSignal.catchError(...)
Отличие от Driver: Driver и Signal очень похожи (оба работают на главном потоке и не реиграют события). Основное различие — Driver предназначен для «состояния» (например, результат запроса для привязки к UILabel), а Signal — для «событий» (например, нажатия кнопки).