webentwicklung-frage-antwort-db.com.de

Zugriff auf ein String-Enum nach Index

Ich habe eine Aufzählung in C und der Index muss durch einen String dargestellt werden.

Wie kann ein Swift-Enum des Typs String vom Integer-Index verwendet werden?

Ich möchte das Enum nach Swift kopieren, den Typ auf string setzen und alle Rohwerte für die Anzeige von Text definieren und dann den C-enum-Wert verwenden, um den Rohwerttext für das Swift-String-Enum zu extrahieren.

Ansonsten werde ich einfach ein Array von Strings erstellen. Aber die Aufzählung wäre mehr brauchbar.

16
jarryd

In Swift enthalten Enummentypen keine Indexinformationen zu Fällen (zumindest nicht für Programmierer verfügbar).

So:

Wie kann ein Swift-Enum des Typs String vom Integer-Index verwendet werden?

Die Antwort lautet "Sie können nicht".


Sie können Int- (oder enum-Fälle) und String-Werte auf viele andere Arten als binden, indem Sie einfach ein Array von Strings erstellen.

Wenn Ihre gebundenen Zeichenfolgen beispielsweise mit Falletiketten identisch sein können, können Sie Folgendes schreiben:

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 Ihre Strings etwas komplexer sein müssen, um Text anzuzeigen, können Sie Swift Dictionary verwenden, um Enumerationsfälle 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 bisschen besser lesbar als ein einfaches Array von Strings.

33
OOPer

Einfache Problemumgehung, die auch nützlich ist, wenn Sie eine Zeichenfolgenumgebung auflisten 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
13

Swift 4.2 führte CaseIterable ein, das genau dasselbe tut, ohne ein allValues-Array deklarieren zu müssen. Es funktioniert so:

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

und Sie können auf deren Werte zugreifen 

MyEnum.allCases

oder einen Wert an einem bestimmten Index von

MyEnum.allCases[index]
1
Bogdan Razvan