除了`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
相关产品推荐
相关产品推荐

