首页 > 解决方案 > 组合框架 removeDuplicates 的奇怪行为

问题描述

考虑:

let test = [(1,true), (2,false), (3,false), (4,true), (5,true), (6,true)]
test.publisher.removeDuplicates { $0.1 != $1.1 }
    .sink { print($0.0) }

这是 (Int,Bool) 对的序列。我想在我的removeDuplicates过滤器中说的是:“不要让 Bool 与之前的 Bool 发生变化的任何对通过。”

所以我期望的是:

所有其他人都应该通过,所以结果应该是1,3,5,6

但事实并非如此。是1,4,5,6

谁能解释为什么?这里使用的是什么推理removeDuplicates

我知道答案;我认为它将来自上游的当前值与允许通过过滤器的先前值进行比较。于是,1与它打通true,然后23被压制,因为它们false那个不同。

但这肯定不对吗?当然,我们应该与来自上游的先前值进行比较?

[文档实际上对此感到奇怪的腼腆。他们说“仅发布与前一个元素不匹配的元素”。我认为这意味着“从上游到达的前一个元素”。但似乎相反,它的意思是“我们实际发布到下游的前一个元素”?]

标签: swiftcombine

解决方案


的行为removeDuplicates与其祖父 Rx.NET 的行为相匹配,DistinctUntilChanged您可以在此处查看其源代码。

在“相等”值“a, a, a, ...”的流中,将每个新的“a”存储为先前值需要复制该值,并可能调整引用计数(如果它是具有引用属性的值类型)。坚持第一个“a”可以避免这项工作。


推荐阅读