2016-03-31 6 views
2

Ich möchte eine Erweiterung von allen Typen erstellen, die die .contains API haben.Wie erstelle ich Erweiterungen für alle Typen mit ".contains"?

Zum Beispiel habe ich tat dies für Streicher, aber möchte es für alle Arten erweitern:

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

Damit statt dessen:

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

Ich kann dies tun Zweckdienlichkeit:

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

Aber ich möchte mit so etwas wie dies zum Beispiel zur Arbeit:

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

So kann ich mit Aufzählungen dies tun:

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

eine breite Erweiterung möglich für dieses Szenario schafft?

Antwort

6

That version of the contains method ist definiert für jede SequenceType, deren Mitglieder sind Equatable. Also, was Sie wollen, ist Equatable zu erweitern. Wie folgt:

extension Equatable { 
    func within<Seq: SequenceType where Seq.Generator.Element == Self> (values: Seq) -> Bool { 
     return values.contains(self) 
    } 
} 
+2

Große Antwort! Ich habe versucht, 'GeneratorType' zu ​​erweitern, aber das ist definitiv ein besserer Ansatz. – JAL