Comment obtenir le nom de la valeur de l'énumération dans Swift?
Si j'ai une énumération avec les premières Integer
valeurs:
enum City: Int {
case Melbourne = 1, Chelyabinsk, Bursa
}
let city = City.Melbourne
Comment puis-je convertir un city
de la valeur à une chaîne Melbourne
? Est-ce le genre d'un nom de type de l'introspection dans la langue?
Quelque chose comme (ce code ne fonctionnera pas):
println("Your city is \(city.magicFunction)")
> Your city is Melbourne
Vous devez vous connecter pour publier un commentaire.
De Xcode 7 beta 5-vous pouvez maintenant imprimer les noms de type enum cas par défaut à l'aide de
print(_:)
, ou de les convertir àString
à l'aide deString
'sinit(_:)
initialiseur ou chaîne interpolation de la syntaxe. Donc pour ton exemple:Donc il n'est plus nécessaire de définir & maintenir une fonction de commodité qui passe sur chaque cas pour retourner une chaîne littérale. En outre, cela fonctionne automatiquement pour n'importe quel enum, même si pas de matières-type de la valeur est spécifiée.
debugPrint(_:)
&String(reflecting:)
peut être utilisé pour un nom pleinement qualifié:Notez que vous pouvez personnaliser ce qui est imprimé dans chacun de ces scénarios:
(Je n'ai pas trouvé un moyen d'appeler à cette valeur "par défaut", par exemple, pour imprimer "de La ville de Melbourne" sans recourir retour à une instruction switch. À l'aide de
\(self)
dans la mise en œuvre dedescription
/debugDescription
provoque une récursion infinie.)Les commentaires ci-dessus
String
'sinit(_:)
&init(reflecting:)
initialiseurs de décrire exactement ce qui est imprimé, selon l'expression de type conforme à:Voir la notes de version pour info au sujet de ce changement.
print(enum)
vous pouvez utiliserString(enum)
let cityDebugName = String(reflecting: city)
CLAuthorizationStatus
enum valeur à l'intérieur de votrelocationManager didChangeAuthorizationStatus
délégué de rappel, vous devez définir une extension du protocole. Par exemple:extension CLAuthorizationStatus: CustomStringConvertable { public var description: String { switch self { case .AuthorizedAlways: return "AuthorizedAlways" <etc> } } }
- une fois que vous avez fait cela, il doit travailler comme vous le souhaitez: print("Auth statut: (\status))".Il n'est pas de l'introspection sur enum cas pour le moment. Vous devrez les déclarer chaque manuellement:
Note: Le
Printable
protocole ne fonctionne pas actuellement dans les aires de jeux. Si vous voulez voir la chaîne dans une aire de jeux, vous devrez appeler toRaw() manuellementSi vous avez besoin de la crue de type d'être un Int, vous aurez à faire un commutateur de vous-même:
get { ... }
partie pour des raisons de concision si vous ne définissez pas un setter.enum City : String, CustomStringConvertible {
. Dans le cadre de la SCC protocole, vous aurez besoin de changer la propriété d'être public, par exemple:public var description : String {
Dans Swift-3 (testé avec Xcode 8.1) vous pouvez ajouter des méthodes suivantes dans votre enum:
Vous pouvez ensuite l'utiliser comme une méthode normale d'appel sur votre enum instance.
Il peut également travailler dans les précédents Swift versions, mais je n'ai pas testé.
Dans votre exemple:
Si vous souhaitez offrir cette fonctionnalité à tous vos énumérations, vous pouvez en faire une extension:
Cela ne fonctionne que pour Swift enums.
Pour Objective-C
enum
s le seul moyen actuellement semble être, par exemple, d'étendre l'enum avecCustomStringConvertible
de se retrouver avec quelque chose comme:Et puis le casting du
enum
commeString
:C'est tellement décevant.
Pour le cas où vous avez besoin de ces noms (que le compilateur connaît parfaitement l'orthographe exacte d', mais refuse de laisser l'accès -- je vous remercie Swift équipe!! --) mais ne veulent pas ou ne peuvent pas faire de Chaîne de caractères de la base de votre enum, un bavard, lourd alternative est comme suit:
Vous pouvez utiliser le haut comme suit:
Et vous obtiendrez le résultat escompté (code pour la Colonne semblable, mais non démontré)
Ci-dessus, j'ai fait le
description
propriété de renvoyer austring
méthode, mais c'est une question de goût. Notez également que l'static
les variables doivent être étendue qualifié par le nom de leur joignant type, le compilateur est trop amnésique et ne se souvient pas du contexte tout par lui-même...L'équipe Swift doit vraiment être commandé. Ils ont créé enum que vous ne pouvez pas
enumerate
et ce que vous pouvez utiliserenumerate
sont des "Séquences", mais pasenum
!Sur le haut de la Chaîne(...) (CustomStringConvertible) soutien pour les enums Swift 2.2, il y a aussi un peu cassé la réflexion de l'aide pour eux. Pour enum cas associés à des valeurs, il est possible d'obtenir le label de l'enum cas, l'utilisation de la réflexion:
En étant cassé, j'ai toutefois signifie que pour de "simples" les énumérations ci-dessus réflexion
label
propriété calculée retourne justenil
(boo-hoo).De la situation avec la réflexion devrait être de mieux en mieux après Swift 3, apparemment. La solution pour l'instant est
String(…)
, comme le suggère l'une de l'autre répond:var label:String { let mirror = Mirror(reflecting: self); if let label = mirror.children.first?.label { return label } else { return String(describing:self) } }
Pour swift :
si votre variable "batteryState", puis composez le :
auto.batteryState.description
Simple mais qui fonctionne...
Swift maintenant a ce qui est connu comme Implicitement Attribué La Valeur Brute. Fondamentalement, si vous ne donnez pas les valeurs brutes de chaque cas et de l'enum est de type Chaîne de caractères, il en déduit que la valeur brute est lui-même dans la chaîne de format. Aller lui donner un essai.