Как создать расширение для всех типов, у которых есть .contains?

Я хотел бы создать расширение для всех типов, которые имеют .contains API.

Например, я сделал это для строк, но хотел бы расширить его для всех типов:

func within(values: [String]) -> Bool {
    return values.contains(self)
}

С этим, вместо этого:

["abc", "def", "ghi"].contains("def")

Я могу сделать это для удобства:

"def".within(["abc", "def", "ghi"])

Но я хотел бы работать с чем-то вроде этого, например:

[.North, .South].contains(.West)

Итак, я могу сделать это с перечислениями:

let value = .West
value.within([.North, .South])

Возможно ли создание широкого расширения для этого сценария?


person TruMan1    schedule 31.03.2016    source источник


Ответы (1)


Эта версия containsметода определена для любого SequenceType членами которого являются Equatable. Итак, вы хотите расширить Equatable. Как это:

extension Equatable {
    func within<Seq: SequenceType where Seq.Generator.Element == Self> (values: Seq) -> Bool {
        return values.contains(self)
    }
}
person Ole Begemann    schedule 31.03.2016
comment
Отличный ответ! Я пытался расширить GeneratorType, но это определенно лучший подход. - person JAL; 31.03.2016