web-dev-qa-db-fra.com

Accéder à une énumération de chaînes par index

J'ai une énumération en C et l'index doit être représenté par une chaîne.

Comment une énumération Swift de type String peut-elle être utilisée avec un index entier?

J'aimerais copier l'énumération dans Swift, définir le type sur chaîne et définir toutes les valeurs brutes pour l'affichage de texte, puis utiliser la valeur C enum pour extraire le texte de valeur brute de l'énumération Swift String.

Sinon, je vais simplement créer un tableau de chaînes .. Mais l'énum serait plus utilisable.

16
jarryd

Dans Swift, les types enum ne contiennent pas les informations d'index des observations (du moins, non fournies aux programmeurs).

Alors:

Comment un enum Swift de type String peut-il être utilisé avec un index entier?

La réponse est "Vous ne pouvez pas".


Vous pouvez lier les valeurs Int (ou enum) et String de différentes manières que créez simplement un tableau de chaînes ..

Par exemple, si vos chaînes liées peuvent être identiques à des libellés de casse, vous pouvez écrire quelque chose comme ceci:

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
}

Si vos chaînes doivent être un peu plus complexes pour afficher du texte , vous pouvez utiliser Swift Dictionary pour lier des cas enum et des chaînes.

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
}

Un peu plus lisible qu'un simple tableau de chaînes .

33
OOPer

Solution de contournement simple qui est également utile si vous souhaitez énumérer une énumération de chaîne.

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
George Filippakos

Swift 4.2 introduction CaseIterable qui fait exactement la même chose sans avoir à déclarer un tableau allValues. Cela fonctionne comme ceci:

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

et vous pouvez accéder à ses valeurs par 

MyEnum.allCases

ou une valeur à un index spécifique par

MyEnum.allCases[index]
1
Bogdan Razvan