Swift Combine:合并不同类型的发布商

Dri*_*kaZ 5 swift swiftui combine

我正在尝试合并多个不同类型的发布商。

我有字符串类型的发布者和类型的发布者,但是当我使用MergeManyor合并它们时CombineLatest,我收到类型不匹配错误。

有没有办法合并不同类型的出版商?请参阅下面的代码示例:

@Published var str1: String?
@Published var str2: String?
@Published var image: Image?
        
Publishers.MergeMany($str1, $str2, $image)
    .removeDuplicates()
    .sink { _ in
        //...
    }
    .store(in: &bag)
Run Code Online (Sandbox Code Playgroud)

jn_*_*pdx 5

假设您没有其他@Published属性,最简单的方法是使用objectWillChange

self.objectWillChange
        .receive(on: RunLoop.main)
        .sink {
            print("objectWillChange...", self.str1, self.str2, self.image)
        }
        .store(in: &bag)
Run Code Online (Sandbox Code Playgroud)

但是,这不会为您提供评论中提到的删除重复项。

如果你愿意,你可以让事情变得更复杂一些:

Publishers.MergeMany(
            $str1.dropFirst().removeDuplicates().map({ _ in }).eraseToAnyPublisher(),
            $str2.dropFirst().removeDuplicates().map({ _ in }).eraseToAnyPublisher(),
            $image.dropFirst().removeDuplicates().map({ _ in }).eraseToAnyPublisher()
        )
        .receive(on: RunLoop.main)
        .sink {
            print("MergeMany...", self.str1, self.str2, self.image)
        }
        .store(in: &bag)
Run Code Online (Sandbox Code Playgroud)

(可能有比我更好的方法map. { _ in }来删除返回类型)

上述方法似乎可以有效地删除单个重复元素,并且仅sink在其中一个元素发生更改时才触发。