Swift: ¿Convertir el valor de enumeración a cadena?
Dada la siguiente enumeración:
enum Audience {
case Public
case Friends
case Private
}
¿ Cómo obtengo la cadena "Public"
de la audience
siguiente constante?
let audience = Audience.Public
La interfaz idiomática para 'obtener una cadena' es usar la CustomStringConvertible
interfaz y acceder al description
captador. Puede especificar el 'tipo sin formato',String
pero el uso de description
oculta la implementación del 'tipo sin formato'; evita comparaciones de cadenas switch/case
y permite la internacionalización, si así lo desea. Defina su enum
como:
enum Foo : CustomStringConvertible {
case Bing
case Bang
case Boom
var description : String {
switch self {
// 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)"
String for 'foo' is Bing
Actualizado : para Swift >= 2.0, reemplazado Printable
conCustomStringConvertible
Nota : El uso CustomStringConvertible
permite Foo
adoptar un tipo de bruto diferente. Por ejemplo enum Foo : Int, CustomStringConvertible { ... }
es posible. Esta libertad puede resultar útil.
No estoy seguro en qué versión de Swift se agregó esta característica, pero en este momento ( Swift 2.1 ) solo necesitas este código:
enum Audience: String {
case public
case friends
case private
}
let audience = Audience.public.rawValue // "public"
También puedes asignar cadenas personalizadas a cada caso:
enum Audience: String {
case public = "The Public"
case friends = "My Friends"
case private = "Private Audience"
}
let audience = Audience.public.rawValue // "The Public"
Cuando se utilizan cadenas para valores sin formato, el valor implícito para cada caso es el texto del nombre de ese caso .
[...]
enum CompassPoint: String { case north, south, east, west }
En el ejemplo anterior, CompassPoint.south tiene un valor bruto implícito de "sur", y así sucesivamente.
Se accede al valor bruto de un caso de enumeración con su propiedad rawValue:
let sunsetDirection = CompassPoint.west.rawValue // sunsetDirection is "west"
Fuente.
En Swift 3, puedes usar esto.
var enumValue = Customer.Physics
var str = String(describing: enumValue)
de Swift cómo usar enum para obtener el valor de una cadena
Por ahora, redefiniré la enumeración como:
enum Audience: String {
case Public = "Public"
case Friends = "Friends"
case Private = "Private"
}
para que pueda hacer:
audience.toRaw() // "Public"
Pero, ¿no es redundante esta nueva definición de enumeración? ¿Puedo mantener la definición de enumeración inicial y hacer algo como:
audience.toString() // "Public"