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.
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 .
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
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]