dans Swift 2 et xcode7, vous n'avez pas besoin de modifier votre code, utilisez simplementprint("\(audience)")
gbdavid
7
Je déteste que l'écoscape Swift soit maintenant rempli de réponses très datées comme celle-ci. Depuis XCode8.2 / Swift3, c'est aussi simple queString(describing: yourEnumValue)
Travis Griggs
@TravisGriggs Cela ne fonctionne plus pour Xcode 11.4
dans xcode7.3 swift2.2, si je fais des choses comme: print("appState: \(application.applicationState)") j'obtiens appState: UIApplicationState quel est le type et non la représentation sous forme de chaîne réelle de la valeur enum. Est-ce que j'ai râté quelque chose? (PS: pour rawValue j'obtiens juste la valeur Int ...)
Martin
@Cyrus votre scénario est différent de celui qui a été demandé dans ce fil. .rawValuerenverra la valeur brute de votre énumération. Le vôtre est public enum UIApplicationState : Intbien de type Int. Vous n'avez également jamais lu ma réponse qui a une citation de la documentation Apple. ... Si vous souhaitez toujours convertir UIApplicationStateen chaîne, je vous suggère de l'étendre UIApplicationStateavec une propriété calculée personnaliséeextension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
DevAndArtist
Ne résout pas le problème d'avoir des énumérations de type non String
denis631
1
@ denis631 que voulez-vous dire? Le type brut d'une énumération peut être n'importe quoi. Une énumération peut même être conforme OptionSetsi vous le souhaitez vraiment. Et la question originale concerne de toute façon Strings.
DevAndArtist
1
si mon enum est écrit comme ceci, enum Test: Int {case A, B}, la valeur rawValue retournera bien sûr int, ce que nous recherchons est un moyen d'obtenir le nom du cas sous forme de chaîne. C'est exactement ce qu'a fait @DanilShaykhutdinov. Regardez sa réponse et dans la question d'origine, l'énumération n'a pas de type, pas une chaîne ou un int.
denis631
209
L'interface idiomatique pour «obtenir une chaîne» consiste à utiliser l' CustomStringConvertible interface et à accéder au descriptiongetter. Définissez votre enumcomme:
enumFoo:CustomStringConvertible{caseBingcaseBangcaseBoomvar description :String{switchself{// Use Internationalization, as appropriate.
case.Bing:return"Bing"case.Bang:return"Bang"case.Boom:return"Boom"}}}
En action:
>let foo =Foo.Bing
foo:Foo=Bing> println ("String for 'foo' is \(foo)"Stringfor 'foo' isBing
Mise à jour : pour Swift> = 2.0, remplacé PrintableparCustomStringConvertible
Remarque : l'utilisation CustomStringConvertiblepermet Food'adopter un type brut différent. Par exemple, enum Foo : Int, CustomStringConvertible { ... }c'est possible. Cette liberté peut être utile.
Un autre moyen plus court de créer la chaîne println est: "String for 'foo' is (foo)"
John MP Knox
3
@ JohnM.P.Knox n'oubliez pas le back-slash comme dans "String for 'foo' is \ (foo)". Edit OK, c'est l'éditeur qui s'en débarrasse, j'ai dû en saisir 2 pour qu'il apparaisse
zmit le
Quel est l'intérêt CustomStringConvertiblesi cela fonctionne aussi bien sans cela?
Daniel van der Merwe
3
CustomStringConvertiblevous permet / vous oblige à définir descriptionce qui vous permet de décider quelle chaîne utiliser pour chaque cas d'énumération - ceci est certainement important pour l'internationalisation et peut-être la lisibilité du code. Si vous ne vous souciez pas de ceux-ci, vous pouvez utiliser 'enum Foo: String {/ * ... * /} `
GoZoner
2
C'est la bonne réponse si votre énumération n'est pas une chaîne ou si vous voulez une chaîne différente de la valeur rawValue. @ denis631
Haagenti
32
Pour l'instant, je redéfinirai l'énumération comme suit:
Mais cette nouvelle définition d'énumération n'est-elle pas redondante? Puis-je conserver la définition initiale de l'énumération et faire quelque chose comme:
Depuis Xcode 7 Beta 3, vous pouvez simplement écrire votre réponse mais sans le = Stringcar il obtient automatiquement une valeur brute (nom du cas) si vous n'en fournissez pas.
Qbyte
3
Au lieu de .toString (), utilisez maintenant .rawValue
SoftDesigner
Dans Swift 1.2, vous pouvez utiliser: println (Audience.Friends.rawValue)
Oleg Popov
32
Dans Swift 3, vous pouvez utiliser ceci
var enumValue =Customer.Physicsvar str =String(describing: enumValue)
J'aime mieux cette façon que la réponse sélectionnée parce que je peux le faireAudience(rawValue: "Friends")
tidwall
12
Mis à jour pour la sortie de Xcode 7 GM. Cela fonctionne comme on l'espère maintenant - merci Apple!
enumRank:Int{caseAce=1,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Jack,Queen,King}let r =Rank.Ace
print(r)// prints "Ace"
print("Rank: \(r)!")// prints "Rank: Ace!"
Dans Swift 2.0, se conformer à CustomStringConvertiblepermettrait en fait de n'utiliser que print(r)dans ce cas.
matm
Dans Xcode 7 beta 4, reflect () semble avoir été désactivé au profit de Mirror (reflétant: x). Cependant, l'objet retourné a une structure différente.
GSnyder
1
Mettez à jour la réponse s'il vous plaît
Ben Sinclair
10
Cela ne pourrait pas être plus simple que cela dans Swift 2 et le dernier Xcode 7 (pas besoin de spécifier le type enum, ou .rawValue, les descripteurs, etc.)
Mis à jour pour Swift 3 et Xcode 8:
enumAudience{casePubliccaseFriendscasePrivate}let audience:Audience=.Public// or, let audience = Audience.Public
print(audience)//"Public"
Juste une observation: cela fonctionne pour les énumérations auto-créées mais ne fonctionne pas pour quelque chose comme HKWorkoutActivityType
Ace Green
Ainsi que pour les chaînes localisées;)
Eugene Braginets
2
La question originale portait sur la conversion de la valeur enum en chaîne dans vos propres énumérations, c'est pour cela que j'ai donné une réponse ... Si vous aimeriez gérer les énumérations UIKit / AppKit, bien sûr, c'est une autre histoire.
gbdavid
1
@gbdavid - Y a-t-il un Q pour les énumérations UIKit / AppKit? J'ai cherché sur Google et je n'ai pas pu le trouver. Je peux soumettre Q si cela est nécessaire.
benc le
8
Un exemple Swift 3 et supérieur si vous utilisez Ints dans Enum
Une solution élégante. "\ (category)" ou directement String (décrivant: category) fonctionnerait également. Même pour les énumérations Int.
t1ser
8
Pour toute personne lisant l'exemple du chapitre "A Swift Tour" de "The Swift Programming Language" et cherchant un moyen de simplifier la méthode simpleDescription (), convertir l'énumération elle-même en String en faisant le String(self)fera:
enumRank:Int{caseAce=1//required otherwise Ace will be 0
caseTwo,Three,Four,Five,Six,Seven,Eight,Nine,TencaseJack,Queen,Kingfunc simpleDescription()->String{switchself{case.Ace,.Jack,.Queen,.King:returnString(self).lowercaseString
default:returnString(self.rawValue)}}}
fonctionnera comme prévu. Ce n'est pas joli et il y a quelques inconvénients parce que vous n'utilisez pas de "enum", vous ne pouvez pas utiliser le raccourci uniquement en ajoutant .Private ne fonctionnera pas non plus avec les cas de commutation.
Ça a l'air bien. Je me demande quelle serait la meilleure pratique pour ce cas particulier. Je préférerais utiliser la syntaxe struct en raison de la simplicité, mais utiliser struct au lieu de enum ne semble pas correct, ou peut-être que c'est juste moi? Eh bien, rien ne vous empêche de déclarer des variables constantes n'importe où ailleurs, cette fois vous l'ajoutez simplement dans une structure pour qu'elle soit organisée. Pensées?
schystz
Exactement, cela fonctionne comme des variables constantes mais plus organisées. Comme je l'ai déjà dit, le seul problème est le "boîtier de commutation" et les raccourcis ".Private". Si vous construisez à partir de zéro votre application, essayez d'utiliser "enum", n'utilisez les structures que si "enum" ne satisfait pas votre code pour une raison quelconque. J'évite personnellement les variables constantes et j'utilise toujours des structures à la place.
Adriano Spadoni
J'utilise ceci pour les clés par défaut. Plutôt que de me souvenir des clés par défaut dans une application, je vide les clés dans une structure et les extrait à partir de là.
Adrian
3
Il existe plusieurs façons de procéder. Soit vous pouvez définir une fonction dans l'énumération qui renvoie la chaîne en fonction de la valeur du type enum:
enumAudience{...func toString()->String{var a:Stringswitchself{case.Public:
a="Public"case.Friends:
a="Friends"...}return a
}
print("\(audience)")
String(describing: yourEnumValue)
Réponses:
Vous ne savez pas dans quelle version Swift cette fonctionnalité a été ajoutée, mais pour le moment ( Swift 2.1 ), vous n'avez besoin que de ce code:
la source
print("appState: \(application.applicationState)")
j'obtiensappState: UIApplicationState
quel est le type et non la représentation sous forme de chaîne réelle de la valeur enum. Est-ce que j'ai râté quelque chose? (PS: pour rawValue j'obtiens juste la valeur Int ...).rawValue
renverra la valeur brute de votre énumération. Le vôtre estpublic enum UIApplicationState : Int
bien de typeInt
. Vous n'avez également jamais lu ma réponse qui a une citation de la documentation Apple. ... Si vous souhaitez toujours convertirUIApplicationState
en chaîne, je vous suggère de l'étendreUIApplicationState
avec une propriété calculée personnaliséeextension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
OptionSet
si vous le souhaitez vraiment. Et la question originale concerne de toute façon Strings.L'interface idiomatique pour «obtenir une chaîne» consiste à utiliser l'
CustomStringConvertible
interface et à accéder audescription
getter. Définissez votreenum
comme:En action:
Mise à jour : pour Swift> = 2.0, remplacé
Printable
parCustomStringConvertible
Remarque : l'utilisation
CustomStringConvertible
permetFoo
d'adopter un type brut différent. Par exemple,enum Foo : Int, CustomStringConvertible { ... }
c'est possible. Cette liberté peut être utile.la source
CustomStringConvertible
si cela fonctionne aussi bien sans cela?CustomStringConvertible
vous permet / vous oblige à définirdescription
ce qui vous permet de décider quelle chaîne utiliser pour chaque cas d'énumération - ceci est certainement important pour l'internationalisation et peut-être la lisibilité du code. Si vous ne vous souciez pas de ceux-ci, vous pouvez utiliser 'enum Foo: String {/ * ... * /} `Pour l'instant, je redéfinirai l'énumération comme suit:
pour que je puisse faire:
Mais cette nouvelle définition d'énumération n'est-elle pas redondante? Puis-je conserver la définition initiale de l'énumération et faire quelque chose comme:
la source
= String
car il obtient automatiquement une valeur brute (nom du cas) si vous n'en fournissez pas.Dans Swift 3, vous pouvez utiliser ceci
de Swift comment utiliser enum pour obtenir une valeur de chaîne
la source
enum
n'est pas basé surString
s"\(enumValue)"
Fait la même chose. ^^J'aime utiliser
Printable
avecRaw Values
.Ensuite, nous pouvons faire:
ou
la source
Audience(rawValue: "Friends")
Mis à jour pour la sortie de Xcode 7 GM. Cela fonctionne comme on l'espère maintenant - merci Apple!
la source
CustomStringConvertible
permettrait en fait de n'utiliser queprint(r)
dans ce cas.Cela ne pourrait pas être plus simple que cela dans Swift 2 et le dernier Xcode 7 (pas besoin de spécifier le type enum, ou .rawValue, les descripteurs, etc.)
Mis à jour pour Swift 3 et Xcode 8:
la source
Un exemple Swift 3 et supérieur si vous utilisez Ints dans Enum
la source
Pour toute personne lisant l'exemple du chapitre "A Swift Tour" de "The Swift Programming Language" et cherchant un moyen de simplifier la méthode simpleDescription (), convertir l'énumération elle-même en String en faisant le
String(self)
fera:la source
Après avoir essayé plusieurs façons différentes, j'ai trouvé que si vous ne voulez pas utiliser:
Vous pouvez toujours l'archiver en utilisant une structure
puis votre code:
fonctionnera comme prévu. Ce n'est pas joli et il y a quelques inconvénients parce que vous n'utilisez pas de "enum", vous ne pouvez pas utiliser le raccourci uniquement en ajoutant .Private ne fonctionnera pas non plus avec les cas de commutation.
la source
Il existe plusieurs façons de procéder. Soit vous pouvez définir une fonction dans l'énumération qui renvoie la chaîne en fonction de la valeur du type enum:
Ou vous pouvez essayer ceci:
Et pour l'utiliser:
la source
À partir de Swift 3.0, vous pouvez
la source