分享
三行代码  ›  专栏  ›  技术社区  ›  Womble

将主题/发布者转换为其他发布者

  •  0
  • Womble  · 技术社区  · 1 周前

    给定一个现有的 CurrentValueSubject 实例,目标是创建一个新的 Publisher 这将获取主题的字符串流,然后将输出int。

    我的方法是把主题映射到 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.
        }
    }
    

    但是,我不能创建一个新的 这种方式。显然,我对出版商的理解是有缺陷的。有人能开导我吗?

    1 回复  |  直到 1 周前
        1
  •  2
  •   New Dev    1 周前

    你只是有点不对劲。

    .map 映射值,因此您需要返回一个新值,而不是一个新的发布者。然后使用 .eraseToAnyPublisher AnyPublisher

    func intPublisher() -> AnyPublisher<Int, Never> {
       subject.map { Int($0) ?? 0 }
              .eraseToAnyPublisher()
    }
    

    你也可以使用 AnyPublisher(subject.map { Int($0) ?? 0 }) 以及(init参数是一个发布者,而不是一个值)。


    为每个值返回一个发布者,但之后需要使用 flatMap . 以下结果与上述结果相同,但只是以不必要的复杂方式:

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