将 Subject/Publisher 转换为另一个发布者

Convert Subject/Publisher to another Publisher

给定一个现有的 CurrentValueSubject 实例,目标是创建一个新的 Publisher,它将采用对象的字符串流,然后输出整数。

我的方法是将主题映射到AnyPublisher:

let subject: CurrentValueSubject<String, Never> = ...

func intPublisher() -> AnyPublisher<Int, Never>
{
    return subject.map { string in
        let value = Int(string) ?? 0
        return AnyPublisher<Int, Never>(value) // Error: Generic parameter P could not be inferred.
    }
}

但是,我无法通过这种方式创建新的 AnyPublisher。显然,我对 Publishers 的理解是有缺陷的。有没有人能赐教一下?

你有点不对劲。

.map 映射值,因此您需要 return 一个新值,而不是新发布者。然后使用 .eraseToAnyPublisher 创建 AnyPublisher 发布者:

func intPublisher() -> AnyPublisher<Int, Never> {
   subject.map { Int([=10=]) ?? 0 }
          .eraseToAnyPublisher()
}

你也可以使用AnyPublisher(subject.map { Int([=15=]) ?? 0 })(初始化参数是一个发布者,而不是一个值)。


为了完整起见,您 可以 return 每个值的发布者,但是您需要使用 flatMap。以下实现了与上面相同的结果,但只是以一种不必要的复杂方式:

subject.flatMap { string in
      Just( Int(string) ?? 0 )
   }.eraseToAnyPublisher()