Estoy tratando de escribir una extensión para una enumeración que es CaseIterable para que pueda obtener una matriz de valores sin procesar en lugar de los casos, aunque no estoy completamente seguro de cómo hacerlo
extension CaseIterable { static var allValues: [String] { get { return allCases.map({ option -> String in return option.rawValue }) } } } necesito agregar una cláusula where de alguna manera, si no tengo una cláusula where obtengo un error que dice 'map' produces '[T]', not the expected contextual result type '[String]'
¿Alguien sabe si hay una buena manera de hacer esto?
Mis enumeraciones en las que quiero que funcione esta función se ven un poco así
enum TypeOptions: String, CaseIterable { case All = "all" case Article = "article" case Show = "show" }No todos los tipos de enumeración tienen un RawValue asociado y, si lo tienen, no es necesariamente un String .
Por lo tanto, debe restringir la extensión a los tipos de enumeración que son RawRepresentable y definir el valor de retorno como una matriz de RawValue :
extension CaseIterable where Self: RawRepresentable { static var allValues: [RawValue] { return allCases.map { $0.rawValue } } }Ejemplos:
enum TypeOptions: String, CaseIterable { case all case article case show case unknown = "?" } print(TypeOptions.allValues) // ["all", "article", "show", "?" ] enum IntOptions: Int, CaseIterable { case a = 1 case b = 4 } print(IntOptions.allValues) // [1, 4] enum Foo: CaseIterable { case a case b } // This does not compile: print(Foo.allValues) // error: Type 'Foo' does not conform to protocol 'RawRepresentable'