如何在Swift Combine中的数组CurrentValueSubject的单个元素上应用.filter运算符?
我有一个CurrentValueSubject,它是ChatModelFirebase的数组。我要做的是删除状态字段为Cancelled的所有ChatModelFirebase模型。问题是,当我应用.filter。。运算符它作用于整个数组,而不是单个项如何在Swift Combine中的数组CurrentValueSubject的单个元素上应用.filter运算符?,swift,swift5,combine,Swift,Swift5,Combine,我有一个CurrentValueSubject,它是ChatModelFirebase的数组。我要做的是删除状态字段为Cancelled的所有ChatModelFirebase模型。问题是,当我应用.filter。。运算符它作用于整个数组,而不是单个项 var chatFirebaseModels: CurrentValueSubject<[ChatModelFirebase], Never> = CurrentValueSubject([]) chatFirebaseModels
var chatFirebaseModels: CurrentValueSubject<[ChatModelFirebase], Never> = CurrentValueSubject([])
chatFirebaseModels
.filter({ (chatModelFireBaseArray) -> Bool in
// I want individual array items, not chatModelFireBaseArray
return false
})
下面是代码完成的样子:
你可以看到。过滤器。。正在应用于[ChatModelFirebase]阵列,而不是单个ChatModelFirebase模型
这里的答案就是使用.flatMap。。?我很好奇是否有正确的方法使用.filter…,因此我提出了一个问题。您可以使用.map返回过滤后的数组:
chatFirebaseModels
.map { array in
array.filter { element in
// ... filter by element
}
}
或者使用纯粹的联合收割机链条,看起来不必要的复杂:
chatFirebaseModels
.flatMap { Publishers.Sequence(sequence: $0) }
.filter { element in
// ... filter by element
}
.collect()
您可以使用.map返回过滤后的数组:
chatFirebaseModels
.map { array in
array.filter { element in
// ... filter by element
}
}
或者使用纯粹的联合收割机链条,看起来不必要的复杂:
chatFirebaseModels
.flatMap { Publishers.Sequence(sequence: $0) }
.filter { element in
// ... filter by element
}
.collect()
视情况而定,是否要将数组和筛选器元素保留在它们自己的数组中?->使用.map{$0.filter{…}。要过滤所有行业元素吗?->使用平面图{$0}。过滤器{…}。我不确定是否理解您的问题。目标是删除数组中与特定布尔条件不匹配的某些项。我的问题是关于映射+筛选的结果。您是否希望使用flatmap或[[ChatModelFirebase]]map+filter以[ChatModelFirebase]结束,就像您在问题中建议的那样。从某种意义上说,这两种方法都是正确的,它们最终实现了相同的功能,但最终的类型会有所不同。哦,我明白了。只想得到一个模型数组,即[ChatModelFirebase]。这取决于情况,是否要将数组和筛选器元素保留在它们自己的数组中?->使用.map{$0.filter{…}。要过滤所有行业元素吗?->使用平面图{$0}。过滤器{…}。我不确定是否理解您的问题。目标是删除数组中与特定布尔条件不匹配的某些项。我的问题是关于映射+筛选的结果。您是否希望使用flatmap或[[ChatModelFirebase]]map+filter以[ChatModelFirebase]结束,就像您在问题中建议的那样。从某种意义上说,这两种方法都是正确的,它们最终实现了相同的功能,但最终的类型会有所不同。哦,我明白了。我们只想得到一系列模型,即[ChatModelFirebase]。