Издатель против AnyPublisher в комбинате

Какова роль AnyPublisher в Combine и почему во многих примерах, в том числе в WWDC Combine На практике 27:40 они возвращают AnyPublisher, используя .eraseToAnyPublisher, а не просто вернуть издателя?

В Apple Documents говорится

Используйте AnyPublisher, чтобы обернуть издателя, тип которого содержит данные, которые вы не хотите показывать подписчикам или другим издателям.

Но кто-нибудь может привести пример, где это может быть полезно?

0 ответов

Publisher это протокол со связанными типами, а AnyPublisherэто структура.

Попробуйте транслировать на Publisher и вы получите ошибку

let x = Just(1) as Publisher

Протокол "Издатель" может использоваться только в качестве общего ограничения, потому что он имеет собственные или связанные требования к типу.

И это при том, что Just это Publisher.

В Publisher type нельзя использовать так же, как 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) }
  }
}

Publisher - это протокол, а AnyPublisher - конкретная реализация Publisher.

AnyPublisher - это структура со стиранием типов, соответствующая протоколу издателя. Стирание типа позволяет скрыть сведения об издателе, которые, возможно, не захотят раскрывать подписчикам или последующим издателям.

Примечание: AnyPublisher не имеет оператора отправки (_:), поэтому новые значения не могут быть добавлены этому издателю.

Другие вопросы по тегам