Swift 何时不使用橡皮擦AnyPublisher()

Swift 何时不使用橡皮擦AnyPublisher(),swift,combine,Swift,Combine,联合收割机似乎是在考虑类型擦除的情况下构建的。一个原因是要避免由许多链式运算符生成的复杂类型,如本文中定义的解释 我很好奇,在哪些情况下,您不想调用eraseToAnyPublisher()。我想到了一个可能的候选人: func fetchResource() -> Future<Model, Error> 这允许您向使用者隐藏实现细节并防止误用。不过有一个折衷办法。。。消费者不知道未来的语义: Future一经创建就立即执行,而有些发布服务器仅在有订阅时才发出值 Futu

联合收割机似乎是在考虑类型擦除的情况下构建的。一个原因是要避免由许多链式运算符生成的复杂类型,如本文中定义的解释

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

func fetchResource() -> Future<Model, Error>
这允许您向使用者隐藏实现细节并防止误用。不过有一个折衷办法。。。消费者不知道
未来的语义

  • Future
    一经创建就立即执行,而有些发布服务器仅在有订阅时才发出值
  • Future
    保留其最终结果,并将该值共享/重播给任何未来订户
有谁知道什么时候你不会
删除任何publisher()
的好例子吗

  • AnyPublisher
    只是一个临时解决方案,直到我们能够向不透明类型添加约束
  • e、 g.这个

    var publisher:AnyPublisher{.init(Just(1))}
    
    …实际上应该是这样的:

    var发布者:某些发布者
    其中Publisher.Output==Int,Publisher.Failure==Never{
    刚刚(1)
    }
    
    在Swift论坛上,您会发现很多关于如何不容易实现(以及使用什么语法!)的讨论,因此我们仍然使用公共类型擦除类型的中间解决方案


  • Future
    Publisher
    之间没有协议。这就是你想要的,这个问题。如果您想强制执行更强大的契约,请向继承的协议添加一些内容
  • 未来协议:发布者{
    扩展未来:未来{
    
    …然后,不幸的是,您必须创建另一种擦除类型。目前

    struct AnyFuturey{
    
    eraseToAnyPublisher
    /
    AnyPublisher
    旨在解决无法将
    Publisher
    用作变量/属性/参数/方法返回类型的问题,而且它不像
    eraseToAnyPublisher
    有任何替代品……因此答案只是“当您不需要它时”。那么类型擦除的好处呢?是否有一些特定的场景,在这些场景中,显示语义的重要性超过了防止误用的好处?(例如未来)顺便问一下,
    dataTaskPublisher
    返回一个
    URLSession。dataTaskPublisher
    …哎呀,我在那里做了一个假设…将修复“是否存在特定的场景…?”我认为这正进入基于意见的领域,但根据我的经验,几乎不值得声明一种方法来返回特定类型的发布者。如果您的
    fetchResource
    将来需要更改怎么办(没有双关语)?假设它现在需要在返回之前对其输出进行一点映射。它的返回类型现在需要是
    publisher.map
    。调用方依赖它返回
    未来的
    将立即中断。
    
    func fetchResource() -> AnyPublisher<Model, Error>