如何将输出为[String]的Combine Publisher转换为输出单个String
解决方案:将输出数组的Combine Publisher转换为输出单个元素
你不需要自定义PublisherX,Combine内置的操作符就能实现这个需求,核心思路是把上游输出的数组拆解为逐个输出的元素:
修改后的Playground代码
import Combine var subj = PassthroughSubject<[String], Never>() // 转换为输出单个String元素的Publisher let transformedPublisher = subj .flatMap { array in array.publisher // 直接将数组转为输出每个元素的Sequence Publisher } .eraseToAnyPublisher() // 类型为AnyPublisher<String, Never> let cancel = transformedPublisher.sink { value in print(value) // 预期输出: // "1" // "2" // "3" } subj.send(["1", "2", "3"])
原理说明
flatMap操作符接收上游传来的数组,返回一个新的Publisher:这里利用Swift数组的publisher属性,直接把数组转换成会逐个输出自身元素的Sequence Publisher- 当上游发送一次数组时,下游会依次输出数组中的每个元素,完全匹配你想要的效果
替代写法(效果一致)
如果不想用array.publisher,也可以显式创建Sequence Publisher:
let transformedPublisher = subj .flatMap { Publishers.Sequence(sequence: $0) } .eraseToAnyPublisher()
内容的提问来源于stack exchange,提问作者Yogurt
相关产品推荐
相关产品推荐

