首页 > 解决方案 > 如何制作通用序列过滤器包装器?过滤器包含 Set 和 Array 类型的相同块

问题描述

我有地方,我有SetArrayMyType

在这些地方,我需要过滤掉 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
        }
    }
}

标签: swiftgenericsswift-extensions

解决方案


很不幸的是,不行。Set有两个重载filter(_:),具有以下类型:

  1. func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
  2. func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> Set<Self.Element>

首先是满足一致性要求的实现Sequence。后者只是一种Set实现的方法,不依赖于任何协议。

没有通用的方法来引用FilterArray<Self.Element>. 有一个 Swift Evolution 提议来解决这个问题(SE-0174 - Change filter to return an associated type)。它已被接受,但尚未实施。


推荐阅读