2016-09-03 16 views
12

Ich habe eine Enum in C und der Index muss durch einen String dargestellt werden.Zugriff auf eine String Enum durch Index

Wie kann ein Swift Enum von String-Typ durch Integer-Index verwendet werden?

Ich möchte die Enumeration nach Swift kopieren, den Typ auf Zeichenfolge festlegen und alle Rohwerte definieren, um Text anzuzeigen, und dann den C enum-Wert verwenden, um den Rohwerttext für die Swift String-Enumeration zu extrahieren.

Ansonsten werde ich nur ein Array von Strings schaffen .. Aber die ENUM würde mehr verwendbar sein.

Antwort

22

In Swift, Aufzählungstypen nicht halten seinen Index Info der Fälle (zumindest nicht für Programmierer zur Verfügung gestellt).

So:

Wie kann ein Swift Enum von String-Typ durch Integer-Index verwendet werden?

Die Antwort lautet „Sie können nicht“.


können Sie binden Int (oder Enum-Fälle) und String Werte in vielerlei Hinsicht anders als nur ein Array von Strings erstellen ..

Zum Beispiel, wenn Ihre gebundenen Strings können die gleiche sein wie

enum MyEnum: Int { 
    case foo 
    case bar 
    case baz 

    var string: String { 
     return String(self) 
    } 
} 

if let value = MyEnum(rawValue: 0) { 
    print(value.string) //->foo 
} 

Wenn Ihr Strings sein müssen, ein wenig komplexer anzuzeigen Text, können Sie uns: Fall Etiketten, können Sie so etwas schreiben e Swift Dictionary, um Enum Cases und Strings zu binden.

enum AnotherEnum: Int { 
    case foo 
    case bar 
    case baz 

    static let mapper: [AnotherEnum: String] = [ 
     .foo: "FooString", 
     .bar: "BarString", 
     .baz: "BazString" 
    ] 
    var string: String { 
     return AnotherEnum.mapper[self]! 
    } 
} 

if let value = AnotherEnum(rawValue: 1) { 
    print(value.string) //->BarString 
} 

Ein wenig besser lesbar als ein einfaches Array von Strings.

+0

Sehr schön, danke :) – jarryd

4

einfache Abhilfe, die auch nützlich, wenn Sie einen String enum aufzuzählen möchten.

enum MyEnum: String { 
    case foo = "fooString" 
    case bar = "barString" 
    case baz = "bazString" 

    static let allValues = [foo, bar, baz] //must maintain second copy of values 
} 

//enumeration advantage 
for value in MyEnum.allValues { 
    print(value) 
} 

//get value by index 
let value = MyEnum.allValues[1] 

print(value) //barString 
+0

absolut genial, danke. Ich vermute, das wird es in die Sprache selbst schaffen. Es sei denn, es gibt eine bereits bestehende Methode, um auf dasselbe zuzugreifen. –