2016-07-11 5 views
0

In meiner aktuellen Implementierung, ich vorbei zu einer Funktion eine Zeichenfolge Enum rawValue wie folgt aus:Welcher Typ ist ein String enum, so dass es als Parameter verwendet werden kann?

enum Compass: String { 
    case North, South, East, West 
} 

func something(key: String) {...} 

something(Compass.East.rawValue) 

Gibt es eine andere Art andere als String für die Funktion, so kann ich so etwas tun?

something(Compass.East) 

Ich will nicht den key Parameter vom Typ machen Compass, weil ich enums kommen aus verschiedenen Orten, aber alles erben von String.

Ich habe versucht, dies zu tun, bekam aber einen Fehler:

func etwas (Schlüssel: StringLiteralConvertible) {...} // Fehler: Protokoll 'StringLiteralConvertible' kann nur als generische Einschränkung verwendet werden

Gibt es einen Typ, den ich verwenden kann, muss ich nicht jedes Mal rawValue verwenden.

Antwort

7

Sie können dies tun:

func something<T: RawRepresentable where T.RawValue == String>(key: T) { 
    let string = key.rawValue 
} 

something(Compass.East) 

Auf diese Weise können Sie in jedem Enum übergeben, die String s als seine Werte

hat