J'ai l'énumération suivante.
enum EstimateItemStatus: Printable {
case Pending
case OnHold
case Done
var description: String {
switch self {
case .Pending: return "Pending"
case .OnHold: return "On Hold"
case .Done: return "Done"
}
}
init?(id : Int) {
switch id {
case 1:
self = .Pending
case 2:
self = .OnHold
case 3:
self = .Done
default:
return nil
}
}
}
J'ai besoin d'obtenir toutes les valeurs brutes sous forme de tableau de chaînes (comme ça ["Pending", "On Hold", "Done"]
).
J'ai ajouté cette méthode à l'énumération.
func toArray() -> [String] {
var n = 1
return Array(
GeneratorOf<EstimateItemStatus> {
return EstimateItemStatus(id: n++)!.description
}
)
}
Mais j'obtiens l'erreur suivante.
Impossible de trouver un initialiseur pour le type 'GeneratorOf' qui accepte une liste d'arguments de type '(() -> _)'
Existe-t-il une manière plus simple, meilleure ou plus élégante de le faire?
Réponses:
Pour Swift 4.2 (Xcode 10) et versions ultérieures
Il y a un
CaseIterable
protocole:Pour Swift <4.2
Non, vous ne pouvez pas interroger un
enum
pour les valeurs qu'il contient. Consultez cet article . Vous devez définir un tableau qui répertorie toutes les valeurs que vous avez. Consultez également la solution de Frank Valbuena dans " Comment obtenir toutes les valeurs d'énumération sous forme de tableau ".la source
Swift 4.2 introduit un nouveau protocole nommé
CaseIterable
que lorsque vous vous conformez à, vous pouvez obtenir un tableau à partir des
enum
cas comme celui-cila source
Ajoutez le protocole CaseIterable à enum:
Usage:
la source
Il existe au moins un autre moyen sûr au moment de la compilation:
Notez que cela fonctionne pour tout type d'énumération (RawRepresentable ou non) et aussi si vous ajoutez un nouveau cas, vous obtiendrez une erreur de compilation qui est bonne car vous obligera à l'avoir à jour.
la source
J'ai trouvé quelque part ce code:
Utilisation:
renvoyer la liste des cas de YourEnum
la source
Pour obtenir une liste à des fins fonctionnelles, utilisez l'expression
EnumName.allCases
qui renvoie un tableau par exemplevous donnera une liste de chaînes étant donné que
EnumName: String, CaseIterable
Remarque: utilisez à la
allCases
place deAllCases()
.la source
["En attente", "En attente", "Terminé"]
la source
Mise à jour pour Swift 5
La solution la plus simple que j'ai trouvée est d'utiliser
.allCases
sur une énumération qui s'étendCaseIterable
.allCases
sur n'importe quelleCaseIterable
énumération retournera unCollection
élément de cet élément.plus d'infos sur CaseIterable
la source
case OnHold = "On Hold"
et cela devient la valeur brute de chacun.Pour Swift 2
Pour l'utiliser:
la source
hashValue
seraient-ils0..n
?Après l'inspiration de la séquence et des heures d'erreurs d'essai. J'ai enfin eu cette façon confortable et belle Swift 4 sur Xcode 9.1:
Usage:
Production:
la source
Vous pouvez utiliser
la source
Si votre énumération est incrémentielle et associée à des nombres, vous pouvez utiliser une plage de nombres que vous mappez aux valeurs d'énumération, comme ceci:
Cela ne fonctionne pas tout à fait avec les énumérations associées à des chaînes ou à autre chose que des nombres, mais cela fonctionne très bien si tel est le cas!
la source
Extension sur une énumération pour créer allValues.
la source