了解泛型以及如何

Understanding generics and how

我是一家公司的新手,正在尝试了解使用过的仿制药。模型的设置包含

var selectedChannel: Driver<Channel> { get }

@available(*, deprecated, message: "Use driver selectedChannel")
var selectedChannelValue: Channel { get }

在代码中的某些地方使用了 selectedChannelValue.id,但它显示了警告消息 Use driver selectedChannel。我明白这一点。好吧,它仍然可以工作,但是以前的一位程序员出于某种原因弃用了它。

如何重写代码行以便我得到 selectedChannel.id 正如弃用消息所建议的那样?当我使用 selectedChannel.id 时,出现错误消息 Value of type 'Driver<Channel>' (aka 'SharedSequence<DriverSharingStrategy, Channel>') has no member 'id'。如何打开 SharedSequence?

编辑: channel 结构如下所示:

public struct Channel: Codable {
    public let id: String    // e.g. "1111111"

driverRxCocoa 中设置为:

public typealias Driver<Element> = SharedSequence<DriverSharingStrategy, Element>

public struct DriverSharingStrategy: SharingStrategyProtocol {
    public static var scheduler: SchedulerType { return SharingScheduler.make() }
    public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {
        return source.share(replay: 1, scope: .whileConnected)
    }
}
extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy {
    /// Adds `asDriver` to `SharingSequence` with `DriverSharingStrategy`.
    public func asDriver() -> Driver<Element> {
        return self.asSharedSequence()
    }
}

通过将 Channel 包装在驱动程序中,代码告诉您它是异步的。所以当你查询它时它可能还不存在,而当你观察它时它可能会发生变化。您使用 drive 方法观察它:

selectedChannel
    .drive(onNext: { channel in
        // you can use channel.id here.
    })
    .disposed(by: disposeBag)

但是您不能只将 id 保存在闭包之外的某个 var 中并期望一切正常。需要 id 的代码也必须是那个闭包(或者在从那个闭包调用的函数中。)

请注意,您可能需要在包含此代码的 class 中创建一个处理包。

DriverObservable的一种。您应该阅读如何使用这些构造,但出于这些目的,您可以将其视为封装在对象中的回调闭包。