AnyPublisher 在 Combine 中的作用是什么,以及为什么在许多示例中,包括在WWDC Combine 中,在实践中,27:40他们返回 AnyPublisher,使用.eraseToAnyPublisher
,而不仅仅是返回一个 Publisher?
苹果文件说
使用 AnyPublisher 包装一个发布者,其类型包含您不想向订阅者或其他发布者公开的详细信息。
但是任何人都可以举一个例子说明它在哪里有用吗?
AnyPublisher 在 Combine 中的作用是什么,以及为什么在许多示例中,包括在WWDC Combine 中,在实践中,27:40他们返回 AnyPublisher,使用.eraseToAnyPublisher
,而不仅仅是返回一个 Publisher?
苹果文件说
使用 AnyPublisher 包装一个发布者,其类型包含您不想向订阅者或其他发布者公开的详细信息。
但是任何人都可以举一个例子说明它在哪里有用吗?
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) }
}
}
Publisher 是一个协议,AnyPublisher 是 Publisher 的具体实现。
AnyPublisher 是符合 Publisher 协议的类型擦除结构。类型擦除允许隐藏可能不想向订阅者或下游发布者公开的发布者的详细信息。
注意:AnyPublisher 没有 send(_:) 运算符,因此无法将新值添加到该发布者。