Комментарии 9
Хорошо бы написать зачем это может понадобится, а не сразу в карьер. Представьте, что разработчик не в курсе, что такое Publisher, Subscription и Subscriber, и просто в ленте нашёл вашу статью. Может оно ему надо, но из статьи это непонятно.
Вы выбрали неудачный пример для демонстрации реактивного программирования. Оно хорошо подходит для асинхронных long-running операций, числа Фибоначчи проще рассчитывать по-требованию. Писать собственный Publisher для вычисления простой последовательности выглядит оверинжинирингом. Для существующих источников (Future, Just, Record) представлено много операторов, с их помощью можно построить самые разные цепочки. Например такую
import Combine
let _ = (0...9)
.publisher
.scan ((1, 0), { source, _ -> (Int, Int) in
let (first, second) = source
return (second, first + second)
})
.sink { (first, _) in
print(first)
}
Согласен, что приведенный пример с практической точки зрения мало полезен, можно было написать свой паблишер, который например как-то UIKit расширяет или добавляет какой-то полезный оператор.
Combine идет только с iOS 13.0+
Property wrappers доступны со Swift 5.1, property wrappers это по сути синтаксический сахар, как красиво обернуть переменную, например при использовании UserDefaults. Выражение @Published добавляет к объекту паблишер этого типа и к которому можно достучаться через $.
Написать свой @Published, который под капотом будет отправлять нотификации через NotificationCenter это просто, а вот что с этим делать совсем понятно.
Когда я пытался что‐то похожее провернуть, @available не давало нужного эффекта — всё равно ошибки сыпались.
А #if canImport(SwiftUI) тоже не срабатывает должным образом, поскольку Apple зачем то сделало так, что SwiftUI в iOS 12 импортируется, но ничего не работает.
Создание своего Publisher'a в Combine