Swift: ¿Convertir el valor de enumeración a cadena?

Resuelto ma11hew28 asked hace 10 años • 19 respuestas

Dada la siguiente enumeración:

enum Audience {
    case Public
    case Friends
    case Private
}

¿ Cómo obtengo la cadena "Public"de la audiencesiguiente constante?

let audience = Audience.Public
ma11hew28 avatar Jul 11 '14 22:07 ma11hew28
Aceptado

La interfaz idiomática para 'obtener una cadena' es usar la CustomStringConvertible interfaz y acceder al descriptioncaptador. Puede especificar el 'tipo sin formato',String pero el uso de descriptionoculta la implementación del 'tipo sin formato'; evita comparaciones de cadenas switch/case y permite la internacionalización, si así lo desea. Defina su enumcomo:

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 PrintableconCustomStringConvertible

Nota : El uso CustomStringConvertiblepermite Fooadoptar un tipo de bruto diferente. Por ejemplo enum Foo : Int, CustomStringConvertible { ... }es posible. Esta libertad puede resultar útil.

GoZoner avatar Jul 11 '2014 22:07 GoZoner

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.

DevAndArtist avatar Nov 14 '2015 08:11 DevAndArtist

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

Danil Shaykhutdinov avatar Jan 26 '2017 09:01 Danil Shaykhutdinov

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"
ma11hew28 avatar Jul 11 '2014 15:07 ma11hew28