合并中的Publisher与AnyPublisher

时间:2019-08-28 10:24:22

标签: swift combine

AnyPublisher在Combine中的作用是什么?为什么在许多示例中(包括在WWDC Combine In practice, 27:40中,它们使用.eraseToAnyPublisher返回AnyPublisher,而不仅仅是返回Publisher?

Apple Documents

  

使用AnyPublisher来包装发布者,该发布者的类型具有您不希望向订阅者或其他发布者公开的详细信息。

但是任何人都可以举例说明它在哪些方面有用吗?

2 个答案:

答案 0 :(得分:1)

Publisher是具有关联类型的协议,而AnyPublisher struct

尝试强制转换为Publisher,您会收到错误消息

let x = Just(1) as Publisher
  

协议“ Publisher”只能用作一般约束,因为它具有“自我”或相关类型要求

尽管事实JustPublisher

不能以与AnyPublisher相同的方式利用发布者来实现类型擦除。

在定义将泛型作为定义一部分的函数时,可以使用Publisher

使用AnyPublisher的最常见原因:

从函数返回发布者的实例。

使用Publisher的最常见原因:

创建协议扩展以创建自定义的Combine运算符。例如:

extension Publisher {
  public func compactMapEach<T, U>(_ transform: @escaping (T) -> U?)
    -> Publishers.Map<Self, [U]>
    where Output == [T]
  {
    return map { $0.compactMap(transform) }
  }
}

答案 1 :(得分:1)

Publisher是协议,AnyPublisher是Publisher的具体实现。

AnyPublisher是符合Publisher协议的类型擦除结构。通过类型擦除,可以隐藏可能不希望向订阅者公开的发布者或下游发布者的详细信息。

注意: AnyPublisher没有send(_ :)运算符,因此无法将新值添加到该发布者。