type the switch raw protocol not have generic enum does cannot ios swift enums

ios - the - ¿Cómo obtener la enumeración del valor bruto en Swift?



swift4 enum (7)

¡Con Swift 4.2 y el protocolo CaseIterable no es tan difícil!

Aquí hay un ejemplo de cómo implementarlo.

import UIKit private enum DataType: String, CaseIterable { case someDataOne = "an_awesome_string_one" case someDataTwo = "an_awesome_string_two" case someDataThree = "an_awesome_string_three" case someDataFour = "an_awesome_string_four" func localizedString() -> String { // Internal operation // I have a String extension which returns its localized version return self.rawValue.localized } static func fromLocalizedString(localizedString: String) -> DataType? { for type in DataType.allCases { if type.localizedString() == localizedString { return type } } return nil } } // USAGE EXAMPLE override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if let dataType = DataType.fromLocalizedString(localizedString: self.title) { loadUserData(type: dataType) } }

Puede modificarlo fácilmente para devolver el DataType basado en rawValue. ¡Espero que ayude!

Estoy tratando de obtener el tipo de enumeración del valor bruto:

enum TestEnum: String { case Name case Gender case Birth var rawValue: String { switch self { case .Name: return "Name" case .Gender: return "Gender" case .Birth: return "Birth Day" } } } let name = TestEnum(rawValue: "Name") //Name let gender = TestEnum(rawValue: "Gender") //Gender

Pero parece que rawValue no funciona para cadenas con espacios:

let birth = TestEnum(rawValue: "Birth Day") //nil

¿Alguna sugerencia de cómo obtenerlo?


Aquí hay un ejemplo de código más utilizable en Swift 4.1

import UIKit enum FormData { case userName case password static let array = [userName, password] var placeHolder: String { switch self { case .userName: return AppString.name.localized // will return "Name" string case .password: return AppString.password.localized // will return "Password" string } } } enum AppString: String { case name = "Name" case password = "Password" var localized: String { return NSLocalizedString(self.rawValue, comment: "") } }


Creo que esta es una solución rápida y limpia para Swift 4.2 (puedes c & p al patio de recreo)

import UIKit public enum SomeEnum: String, CaseIterable { case sun,moon,venus,pluto } let str = "venus" let newEnum = SomeEnum.allCases.filter{$0.rawValue == str}.first // newEnum is optional if let result = newEnum { print(result.rawValue) }


Demasiado complicado, solo asigne los valores brutos directamente a los casos

enum TestEnum: String { case Name = "Name" case Gender = "Gender" case Birth = "Birth Day" } let name = TestEnum(rawValue: "Name")! //Name let gender = TestEnum(rawValue: "Gender")! //Gender let birth = TestEnum(rawValue: "Birth Day")! //Birth

Si el nombre del caso coincide con el valor bruto, incluso puede omitirlo

enum TestEnum: String { case Name, Gender, Birth = "Birth Day" }

En Swift 3+ todos los casos de enumeración están en lowercased


Ejemplo de trabajo completo:

enum TestEnum: String { case name = "A Name" case otherName case test = "Test" } let first: TestEnum? = TestEnum(rawValue: "A Name") let second: TestEnum? = TestEnum(rawValue: "OtherName") let third: TestEnum? = TestEnum(rawValue: "Test") print("/(first), /(second), /(third)")

Todos funcionarán, pero al inicializar utilizando un valor sin procesar, será opcional. Si esto es un problema, podría crear un inicializador o un constructor para que la enumeración intente manejar esto, agregando un caso de none y devolviéndolo si no se pudo crear la enumeración. Algo como esto:

static func create(rawValue:String) -> TestEnum { if let testVal = TestEnum(rawValue: rawValue) { return testVal } else{ return .none } }


Mostrar el valor sin formato con Enum

import UIKit enum car: String { case bmw = "BMW" case jaquar = "JAQUAR" case rd = "RD" case benz = "BENZ" } class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. label.text = car.bmw.rawValue } }


Puede definir una enumeración como esta:

enum TestEnum: String { case Name, Gender, Birth }

O

enum TestEnum: String { case Name case Gender case Birth }

puede proporcionar un método init que se ajuste por defecto a uno de los valores del miembro.

enum TestEnum: String { case Name, Gender, Birth init() { self = .Gender } }

En el ejemplo anterior, TestEnum.Name tiene un valor bruto implícito de "Nombre", y así sucesivamente.

Accede al valor sin formato de un caso de enumeración con su propiedad rawValue:

let testEnum = TestEnum.Name.rawValue // testEnum is "Name" let testEnum1 = TestEnum() // testEnum1 is "Gender"