Я создаю фреймворк и хочу поддержать ранних пользователей Combine и SwiftUI для некоторых из моих провайдеров, не отказываясь от поддержки предыдущих версий iOS. Мне нравится декларативный стиль, и я часто использую наблюдаемые классы / структуры для переменных состояний, которые могут быть использованы разработчиком. Как добавить поддержку Combine, не отказываясь от поддержки iOS10 + и не кодируя два разных класса?
Я планировал добавить расширение #if canImport(Combine)
для таких классов, чтобы пользователи iOS13 могли использовать его родным способом, не создавая собственные хранилища. Например, они могли бы просто позвонить .sink
или .assign
и получать обновления.
Я не знаю, какой протокол принять. Я думал, что хранилище - это Publisher
, но Publisher
не может использовать метод .send
, когда что-то меняется, и я не знаю, как уведомить Subscriber
.
public class SomeDataProvider<T> {
private var didChangeHandler: ((T?) -> Void)?
public var value: T? {
didSet {
didChangeHandler?(value)
}
}
public func didChange(handler: @escaping ((T?) -> Void)) {
self.didChangeHandler = handler
}
public init() {}
}
Лучшийподход также заключается в эмуляции по крайней мере .sink
(наиболее пригодный для использования) для предыдущих версий iOS, поэтому мы не используем два отдельных метода или разные версии iOS.