You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

除了`sink`,是否有其他方式将Publisher转发到Subject?

等价实现方案

你要的这段代码是给所有Publisher扩展了一个方法,用来把自身的输出值和完成事件转发给指定的Subject,同时返回AnyCancellable用于取消订阅。以下是两种等价实现方式:

1. 显式闭包写法(和原代码逻辑完全一致)

把原代码中的方法引用改成显式闭包形式,功能完全相同,写法更直白:

extension Publisher {
    func send(_ subject: some Subject<Output, Failure>) -> AnyCancellable {
        sink(
            receiveCompletion: { completion in
                subject.send(completion: completion)
            },
            receiveValue: { value in
                subject.send(value)
            }
        )
    }
}

2. 利用Combine内置方法的简洁写法

Combine框架本身就提供了subscribe(_:)方法,专门用来将Publisher的所有事件(包括值和完成信号)发送给Subject,返回的AnyCancellable和原代码完全一致,这是最简洁规范的等价实现:

extension Publisher {
    func send(_ subject: some Subject<Output, Failure>) -> AnyCancellable {
        subscribe(subject)
    }
}

内容的提问来源于stack exchange,提问作者user652038

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:40:56