【发布时间】:2019-10-05 11:55:14
【问题描述】:
我创建了一个框架,我想为我的一些提供商支持 Combine 和 SwiftUI 的早期采用者,而不会放弃之前的 iOS 版本支持。我喜欢声明式风格,并且我经常将可观察的类/结构用于开发人员可以使用的可变状态。如何在不放弃 iOS10+ 支持且不编写两个不同类的情况下添加 Combine 的支持?
我计划将#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 版本。
【问题讨论】:
-
为什么不采用响应式 swift?无论如何,这就是Combine被盗的东西。