gpt4 book ai didi

swift - 何时不使用 eraseToAnyPublisher()

转载 作者:行者123 更新时间:2023-12-04 08:46:26 24 4
gpt4 key购买 nike

Combine 似乎是在考虑类型删除的情况下构建的。一个原因是为了避免由许多链式运算符生成的复杂类型,例如此 question 中定义的解释。 .

我很好奇您不想调用eraseToAnyPublisher() 的情况。我想到了一个可能的候选人:

func fetchResource() -> Future<Model, Error>

在这种情况下,fetchResource 并不意味着发出多次,并且提供 Future 的返回类型会增加功能的清晰度。

您还可以返回 AnyPublisher:

func fetchResource() -> AnyPublisher<Model, Error>

这使您可以向消费者隐藏实现细节并防止误用。虽然有一个权衡......消费者不会知道 Future 的语义:

  • Future 在创建后立即执行,而一些发布者在有订阅时才发出值
  • Future 保留他们的最终结果并向任何 future 的订阅者分享/重播该值

任何人都知道什么时候你不会 eraseToAnyPublisher() 的任何好例子吗?

最佳答案

  1. AnyPublisher 只是一个临时解决方案,直到我们能够为不透明类型添加约束。

例如这……

var publisher: AnyPublisher<Int, Never> { .init(Just(1)) }

……实际上应该是这样的:

var publisher<Publisher: Combine.Publisher>: some Publisher
where Publisher.Output == Int, Publisher.Failure == Never {
Just(1)
}

您会在 Swift 论坛上找到很多关于这如何不容易实现(以及使用什么语法!)的讨论,因此我们仍在使用公共(public)类型删除类型的中间解决方案。


  1. FuturePublisher 之间没有协议(protocol)。这就是你正在寻找的问题。如果您想执行更强大的契约(Contract),请向继承的协议(protocol)添加一些内容……
protocol Futurey: Publisher {
extension Future: Futurey {

...然后,不幸的是,您将不得不创建另一种删除类型。现在。

struct AnyFuturey<Output, Failure> {

关于swift - 何时不使用 eraseToAnyPublisher(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64290448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com