swift - Introspección e iteración en un Enum
enums swift2 (2)
Puede escribir una estructura genérica que proporcione esa capacidad de iteración. En el siguiente ejemplo, los valores enum raw deben comenzar con 0 (lo hace de forma predeterminada) y no tienen espacios entre los valores sin procesar (no puede haber valores en bruto como 0,1,2,3,5 - 4 falta)
public struct EnumGenerator<T> : GeneratorType, SequenceType {
private let enumInit: Int -> T?
private var i: Int = 0
public mutating func next() -> T? { return enumInit(i++) }
public init(_ initFunc: Int -> T?){ self.enumInit = initFunc}
}
enum HeaderStyles:Int{
case h1
case h2
case h3
}
for item in EnumGenerator(HeaderStyles.init){
print(item)
}
¿Es posible averiguar programáticamente cuántos "casos" tiene un Enum en Swift 2 e iterar sobre ellos?
Este código no se compila, pero le da una idea de lo que estoy tratando de lograr:
enum HeaderStyles{
case h1
case h2
case h3
}
for item in HeaderStyles{
print(item)
}
La forma más fácil de iterar en todos los casos es hacer una propiedad calculada que devuelve una Array
de ellos:
enum SomeEnum {
case Zero, One, Two
static var allCases: [SomeEnum] {
return [.Zero, .One, .Two]
}
}
Si desea una matriz automática, puede usar Int
como rawValue para no tener que cambiar ningún código si agrega un case
adicional:
Swift 3/4: ++
y --
se eliminaron y anyGenerator
se renombró a AnyIterator
enum SomeEnum: Int {
case Zero, One, Two
static var allCases: [SomeEnum] {
var i = 0
return Array(AnyIterator{
let newEnum = SomeEnum(rawValue: i)
i += 1
return newEnum
})
}
}
Swift 2
enum SomeEnum: Int {
case Zero, One, Two
static var allCases: [SomeEnum] {
var i = 0
return Array(anyGenerator{ SomeEnum(rawValue: i++) })
}
}
En ambos casos, lo usarías así:
for num in SomeEnum.allCases {
// ...
}