swift enums swift2 introspection

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 { // ... }