en Swift 2 y xcode7 no necesita cambiar nada a su código, solo useprint("\(audience)")
gbdavid
77
Odio que el ecosistema Swift ahora esté lleno de respuestas muy anticuadas como esta. A partir de XCode8.2 / Swift3, es tan fácil comoString(describing: yourEnumValue)
en xcode7.3 swift2.2, si hago cosas como: print("appState: \(application.applicationState)") obtengo appState: UIApplicationState cuál es el tipo y no la representación de cadena real del valor de enumeración. ¿Me estoy perdiendo de algo? (PD: para rawValue solo obtengo el valor Int ...)
Martin
@Cyrus su escenario es diferente de lo que se preguntó en este hilo. .rawValuedevolverá el valor bruto de su enumeración. La tuya es la public enum UIApplicationState : Intque de hecho es de tipo Int. Tampoco has leído mi respuesta, que tiene una cita de los documentos de Apple. ... Si todavía desea convertir UIApplicationStatea cadena, le sugiero que amplíe UIApplicationStatecon una propiedad computada personalizadaextension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
DevAndArtist
No resuelve el problema con tener enumeraciones de tipo no String
denis631
1
@ denis631 ¿qué quieres decir? El tipo crudo de una enumeración puede ser cualquier cosa. Una enumeración puede incluso conformarse OptionSetsi realmente lo desea. Y la pregunta original es sobre Strings de todos modos.
DevAndArtist
1
si mi enumeración se escribe así, prueba enumeración: Int {case A, B}, el rawValue por supuesto devolverá int, lo que estamos buscando es una forma de obtener el nombre del caso como String. Esto es exactamente lo que hizo @DanilShaykhutdinov. Mire su respuesta y en la pregunta original, la enumeración no tiene ningún tipo, ni una Cadena o Int.
denis631
209
La interfaz idiomática para 'obtener una cadena' es usar la CustomStringConvertible interfaz y acceder al descriptiongetter. Define tu enumcomo:
enumFoo:CustomStringConvertible{caseBingcaseBangcaseBoomvar description :String{switchself{// Use Internationalization, as appropriate.
case.Bing:return"Bing"case.Bang:return"Bang"case.Boom:return"Boom"}}}
En acción:
>let foo =Foo.Bing
foo:Foo=Bing> println ("String for 'foo' is \(foo)"Stringfor 'foo' isBing
Actualizado : para Swift> = 2.0, reemplazado PrintableporCustomStringConvertible
Nota : El uso CustomStringConvertiblepermite Fooadoptar un tipo sin procesar diferente. Por ejemplo enum Foo : Int, CustomStringConvertible { ... }es posible. Esta libertad puede ser útil.
Otra forma más corta de crear la cadena println es: "La cadena para 'foo' es (foo)"
John MP Knox
3
@ JohnM.P.Knox no olvide la barra diagonal inversa como en "Cadena para 'foo' es \ (foo)". Editar OK, es el editor el que se está deshaciendo de él, tuve que ingresar 2 de ellos para que se muestre
envíe
¿De qué sirve CustomStringConvertiblesi esto funciona igual de bien sin él?
Daniel van der Merwe
3
CustomStringConvertiblepermite / requiere que defina descriptioncuál le permite decidir qué cadena usar para cada caso de enumeración; esto es importante para la internacionalización seguramente y tal vez la legibilidad del código. Si no te importan, entonces puedes usar 'enum Foo: String {/ * ... * /} `
GoZoner
2
Esta es la respuesta correcta si su enumeración no es una Cadena o si desea una cadena diferente a la de RawValue. @ denis631
A partir de Xcode 7 Beta 3, puede escribir su respuesta, pero sin el = Stringporque obtiene automáticamente un valor sin formato (nombre del caso) si no proporciona ninguno.
Qbyte
3
En lugar de .toString () ahora use .rawValue
SoftDesigner el
En Swift 1.2 puedes usar: println (Audience.Friends.rawValue)
Oleg Popov
32
En Swift 3, puedes usar esto
var enumValue =Customer.Physicsvar str =String(describing: enumValue)
Me gusta más que la respuesta seleccionada porque puedo hacerloAudience(rawValue: "Friends")
tidwall
12
Actualizado para el lanzamiento de Xcode 7 GM. Funciona como uno esperaría ahora, ¡gracias 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!"
En Swift 2.0, ajustarse a en CustomStringConvertiblerealidad permitiría usar solo print(r)en este caso.
matm
En Xcode 7 beta 4, reflect () parece haber sido deshabilitado a favor de Mirror (reflecting: x). Sin embargo, el objeto devuelto tiene una estructura diferente.
GSnyder
1
Actualizar la respuesta por favor
Ben Sinclair
10
No podría ser más simple que esto en Swift 2 y el último Xcode 7 (no es necesario especificar el tipo de enumeración, o .rawValue, descriptores, etc.)
Actualizado para Swift 3 y Xcode 8:
enumAudience{casePubliccaseFriendscasePrivate}let audience:Audience=.Public// or, let audience = Audience.Public
print(audience)//"Public"
Funcionó perfectamente con mis enumeraciones respaldadas por Int
chrislarson
Solo una observación: esto funciona para enumeraciones de creación propia, pero no funciona para algo como HKWorkoutActivityType
Ace Green
Así como para cadenas localizadas;)
Eugene Braginets
2
La pregunta original era sobre cómo convertir el valor de enumeración en una cadena en sus propias enumeraciones, así que para eso respondí ... Si desea manejar las enumeraciones UIKit / AppKit, por supuesto, es una historia diferente.
gbdavid
1
@gbdavid - ¿Hay una Q para las UIKit / AppKit Enums? Busqué en Google y no pude encontrarlo. Puedo enviar Q si es necesario.
benc
8
Un ejemplo rápido 3 y superior si se usa Ints en Enum
Una solución elegante. "\ (categoría)" o directamente String (que describe: categoría) también funcionaría. Incluso para enumeraciones int.
t1ser
8
Para cualquiera que lea el ejemplo en el capítulo "A Swift Tour" de "The Swift Programming Language" y busque una forma de simplificar el método simpleDescription (), al convertir la enumeración a String, lo String(self)hará:
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)}}}
Funcionará como se esperaba. No es bonito y hay algunas desventajas porque no estás usando una "enumeración", no puedes usar el acceso directo solo agregando .Private ni funcionará con los casos de cambio.
Se ve bien. Me pregunto cuál sería la mejor práctica para este caso en particular. Preferiría usar la sintaxis de struct debido a la simplicidad, pero usar struct en lugar de enum no parece correcto, ¿o tal vez soy solo yo? Bueno, nada te impide declarar variables constantes en cualquier otro lugar, esta vez solo lo agregas dentro de una estructura para que esté organizado. Pensamientos?
schystz
Exactamente, funciona como variables constantes pero más organizadas. Como dije antes, el único problema es el "caso de cambio" y los accesos directos ". Privado". Si está creando desde cero su aplicación, intente usar "enum", use estructuras solo si el "enum" no satisface su código por alguna razón. Personalmente, evito las variables constantes y siempre uso estructuras en su lugar.
Adriano Spadoni
Lo uso para las teclas predeterminadas. En lugar de recordar las claves predeterminadas dentro de una aplicación, vuelco las claves en una estructura y las extraigo de allí.
Adrian
3
Hay varias formas de hacer esto. Puede definir una función en la enumeración que devuelve la cadena en función del valor del tipo de enumeración:
enumAudience{...func toString()->String{var a:Stringswitchself{case.Public:
a="Public"case.Friends:
a="Friends"...}return a
}
print("\(audience)")
String(describing: yourEnumValue)
Respuestas:
No estoy seguro de en qué versión de Swift se agregó esta característica, pero en este momento ( Swift 2.1 ) solo necesita este código:
fuente
print("appState: \(application.applicationState)")
obtengoappState: UIApplicationState
cuál es el tipo y no la representación de cadena real del valor de enumeración. ¿Me estoy perdiendo de algo? (PD: para rawValue solo obtengo el valor Int ...).rawValue
devolverá el valor bruto de su enumeración. La tuya es lapublic enum UIApplicationState : Int
que de hecho es de tipoInt
. Tampoco has leído mi respuesta, que tiene una cita de los documentos de Apple. ... Si todavía desea convertirUIApplicationState
a cadena, le sugiero que amplíeUIApplicationState
con una propiedad computada personalizadaextension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
OptionSet
si realmente lo desea. Y la pregunta original es sobre Strings de todos modos.La interfaz idiomática para 'obtener una cadena' es usar la
CustomStringConvertible
interfaz y acceder aldescription
getter. Define tuenum
como:En acción:
Actualizado : para Swift> = 2.0, reemplazado
Printable
porCustomStringConvertible
Nota : El uso
CustomStringConvertible
permiteFoo
adoptar un tipo sin procesar diferente. Por ejemploenum Foo : Int, CustomStringConvertible { ... }
es posible. Esta libertad puede ser útil.fuente
CustomStringConvertible
si esto funciona igual de bien sin él?CustomStringConvertible
permite / requiere que definadescription
cuál le permite decidir qué cadena usar para cada caso de enumeración; esto es importante para la internacionalización seguramente y tal vez la legibilidad del código. Si no te importan, entonces puedes usar 'enum Foo: String {/ * ... * /} `Por ahora, redefiniré la enumeración como:
para que yo pueda hacer:
Pero, ¿no es redundante esta nueva definición de enumeración? ¿Puedo mantener la definición de enumeración inicial y hacer algo como:
fuente
= String
porque obtiene automáticamente un valor sin formato (nombre del caso) si no proporciona ninguno.En Swift 3, puedes usar esto
de Swift cómo usar la enumeración para obtener el valor de cadena
fuente
enum
no se basa enString
s"\(enumValue)"
Hace lo mismo. ^^Me gusta usar
Printable
conRaw Values
.Entonces podemos hacer:
o
fuente
Audience(rawValue: "Friends")
Actualizado para el lanzamiento de Xcode 7 GM. Funciona como uno esperaría ahora, ¡gracias Apple!
fuente
CustomStringConvertible
realidad permitiría usar soloprint(r)
en este caso.No podría ser más simple que esto en Swift 2 y el último Xcode 7 (no es necesario especificar el tipo de enumeración, o .rawValue, descriptores, etc.)
Actualizado para Swift 3 y Xcode 8:
fuente
Un ejemplo rápido 3 y superior si se usa Ints en Enum
fuente
Para cualquiera que lea el ejemplo en el capítulo "A Swift Tour" de "The Swift Programming Language" y busque una forma de simplificar el método simpleDescription (), al convertir la enumeración a String, lo
String(self)
hará:fuente
Después de probar algunas formas diferentes, descubrí que si no quieres usar:
Todavía puedes archivarlo usando una estructura
entonces tu código:
Funcionará como se esperaba. No es bonito y hay algunas desventajas porque no estás usando una "enumeración", no puedes usar el acceso directo solo agregando .Private ni funcionará con los casos de cambio.
fuente
Hay varias formas de hacer esto. Puede definir una función en la enumeración que devuelve la cadena en función del valor del tipo de enumeración:
O puedes probar esto:
Y para usarlo:
fuente
A partir de Swift 3.0 puedes
fuente