swift - 如何制作通用序列过滤器包装器?过滤器包含 Set 和 Array 类型的相同块
问题描述
我有地方,我有Set
和Array
。MyType
在这些地方,我需要过滤掉 my Sequences
,你会注意到这两种类型的filter
块是相同的。Sequence
有什么方法可以实现通用Sequence
扩展,该方法将根据接收者filterFor
返回正确的类型(Set
或)?Array
extension Set where Element: MyType {
func filterFor(valueToMatch:String) -> Set<MyType> {
return self.filter{
$0.myProperty.caseInsensitiveCompare(valueToMatch) == .orderedSame
}
}
}
extension Array where Element: MyType {
func filterFor(valueToMatch:String) -> [MyType] {
return self.filter{
$0.myProperty.caseInsensitiveCompare(valueToMatch) == .orderedSame
}
}
}
解决方案
很不幸的是,不行。Set
有两个重载filter(_:)
,具有以下类型:
func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> Set<Self.Element>
首先是满足一致性要求的实现Sequence
。后者只是一种Set
实现的方法,不依赖于任何协议。
没有通用的方法来引用Filter
除Array<Self.Element>
. 有一个 Swift Evolution 提议来解决这个问题(SE-0174 - Change filter to return an associated type)。它已被接受,但尚未实施。
推荐阅读
- machine-learning - 在 keras 中使用 model.predict 时出现列表“索引超出范围”
- docusignapi - MAX_MEMBERS_EXCEEDED 已超过帐户的最大成员数
- reactjs - 设置状态后在反应冻结中重置输入框
- android - 我在哪里可以找到 api 密钥和密钥可用于 firebase crachlytics
- python-3.x - 如何在fastapi中从内存中返回xlsx文件?
- r - 如何使用矢量化跨行和列运行许多回归
- python - 在python中将def函数合并为一个
- neo4j - Neo4j 数据导入缓慢
- c# - 是否可以在 MVC 中捕获响应并出错?
- angular - 单击编辑数据时如何获取日期