Как я могу сделать универсальную оболочку Sequence Filter? Фильтр содержит один и тот же блок для типов Set и Array. - PullRequest
0 голосов
/ 30 октября 2018

У меня есть места, где у меня есть Set и Array из MyType.

В этих местах мне нужно отфильтровать мой 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
        }
    }
}

1 Ответ

0 голосов
/ 30 октября 2018

К сожалению, нет. 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, который не привязан ни к какому протоколу.

Не существует универсального способа ссылки на вариант Filter, который возвращает что-либо, кроме Array<Self.Element>. Существует предложение Swift Evolution, чтобы исправить это ( SE-0174 - Изменить фильтр, чтобы он возвращал связанный тип ). Он был принят, но еще не реализован.

...