Pull to refresh

Comments 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 расширяет или добавляет какой-то полезный оператор.

Например, было бы интересто взглянуть на реализацию аналога @Published из SwiftUI для UIKit, чтобы можно было использовать код с @Published для iOS 12.
А, точно же, да. А property wrappers доступны в iOS 12? Возможно ли какой‐нибудь суррогат для @Published сделать, чтобы вместо Combine в iOS 12 задействовался NotificationCenter?

Property wrappers доступны со Swift 5.1, property wrappers это по сути синтаксический сахар, как красиво обернуть переменную, например при использовании UserDefaults. Выражение @Published добавляет к объекту паблишер этого типа и к которому можно достучаться через $.


Написать свой @Published, который под капотом будет отправлять нотификации через NotificationCenter это просто, а вот что с этим делать совсем понятно.

Спасибо. А вот как корректно сообщить компилятору, что мы не на iOS 13, и нужно компилировать новое объявление для @Published, а на iOS 13, соответственно, не нужно?

Когда я пытался что‐то похожее провернуть, @available не давало нужного эффекта — всё равно ошибки сыпались.

А #if canImport(SwiftUI) тоже не срабатывает должным образом, поскольку Apple зачем то сделало так, что SwiftUI в iOS 12 импортируется, но ничего не работает.

То что SwiftUI импортируется, при iOS таргете iOS 12, говорит о том, что если в этом файле вы пометите классы или функции как @available(iOS 13.0, *), то в них можно будет использовать API из iOS 13. Свойства класса не могут быть помечены как @available, поэтому с @Published такой трюк не прокатит

Sign up to leave a comment.

Articles