如何为所有具有".contains"的类型创建扩展?

Tru*_*an1 2 swift swift-extensions swift2 swift2.2

我想创建一个具有.containsAPI的所有类型的扩展.

例如,我为字符串做了这个,但是想为所有类型扩展它:

func within(values: [String]) -> Bool {
    return values.contains(self)
}
Run Code Online (Sandbox Code Playgroud)

有了这个,而不是这个:

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

为方便起见,我可以这样做:

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

但是我想和这样的事情一起工作,例如:

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

所以我可以用枚举来做到这一点:

let value = .West
value.within([.North, .South])
Run Code Online (Sandbox Code Playgroud)

是否可以为此方案创建广泛的扩展?

Ole*_*ann 6

该contains方法的版本是为任何SequenceType成员定义的Equatable.所以你想要的是扩展Equatable.像这样:

extension Equatable {
    func within<Seq: SequenceType where Seq.Generator.Element == Self> (values: Seq) -> Bool {
        return values.contains(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案!我试图扩展`GeneratorType`,但这绝对是一种更好的方法. (2认同)