9

AnyPublisher 在 Combine 中的作用是什么,以及为什么在许多示例中,包括在WWDC Combine 中,在实践中,27:40他们返回 AnyPublisher,使用.eraseToAnyPublisher,而不仅仅是返回一个 Publisher?

苹果文件

使用 AnyPublisher 包装一个发布者,其类型包含您不想向订阅者或其他发布者公开的详细信息。

但是任何人都可以举一个例子说明它在哪里有用吗?

4

2 回答 2

8

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

尝试投射到Publisher,你得到一个错误

let x = Just(1) as Publisher

协议 'Publisher' 只能用作通用约束,因为它具有 Self 或关联的类型要求

尽管这Just是一个Publisher.

Publisher不能以AnyPublisher与实现类型擦除相同的方式使用该类型。

您可以使用的地方Publisher是当您定义一个将泛型作为定义的一部分的函数时。

最常见的使用理由AnyPublisher

从函数返回 Publisher 的实例。

最常见的使用理由Publisher

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

extension Publisher {
  public func compactMapEach<T, U>(_ transform: @escaping (T) -> U?)
    -> Publishers.Map<Self, [U]>
    where Output == [T]
  {
    return map { $0.compactMap(transform) }
  }
}
于 2019-11-26T03:52:18.877 回答
3

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

AnyPublisher 是符合 Publisher 协议的类型擦除结构。类型擦除允许隐藏可能不想向订阅者或下游发布者公开的发布者的详细信息。

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

于 2020-10-28T22:07:05.080 回答