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)
假设您没有其他@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在其中一个元素发生更改时才触发。