Swift 枚举上的内省和迭代

Swift 枚举上的内省和迭代,swift,enums,swift2,introspection,Swift,Enums,Swift2,Introspection,是否可以通过编程找出Swift 2中一个枚举有多少个“案例”并对其进行迭代 这段代码不会编译,但它让你了解我要实现的目标: enum HeaderStyles{ case h1 case h2 case h3 } for item in HeaderStyles{ print(item) } 迭代所有案例的最简单方法是生成一个computed属性,该属性返回一个数组: enum SomeEnum { case Zero, One, Two

是否可以通过编程找出Swift 2中一个枚举有多少个“案例”并对其进行迭代

这段代码不会编译,但它让你了解我要实现的目标:

enum HeaderStyles{

    case h1
    case h2
    case h3
}

for item in HeaderStyles{
    print(item)
}

迭代所有案例的最简单方法是生成一个computed属性,该属性返回一个
数组

enum SomeEnum {
    case Zero, One, Two

    static var allCases: [SomeEnum] {
        return [.Zero, .One, .Two]
    }
}
如果您想要一个自动数组,您可以使用
Int
作为原始值,这样,如果您添加了一个额外的
案例
,就不必更改任何代码:

Swift 3/4:
++
-
被删除,
anyGenerator
被重命名为
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++) })
    }
}
在这两种情况下,您都可以这样使用它:

for num in SomeEnum.allCases {
    // ...
}

您可以编写一个提供这种迭代能力的通用结构。在下面的示例中,枚举原始值必须以0开头(默认情况下是这样),并且原始值之间没有间隙(不能有原始值,例如0,1,2,3,5--4缺失)

公共结构枚举生成器:GeneratorType,SequenceType{ 私有let enumInit:Int->T? 私有变量i:Int=0 public mutating func next()->T{return enumInit(i++)} 公共init(initFunc:Int->T?{self.enumInit=initFunc} } 枚举头样式:Int{ 案例h1 案例h2 案例h3 } 对于EnumGenerator(HeaderStyles.init)中的项{ 打印(项目) }
enum必须在编译时声明,因此您——开发人员——确切地知道一个enum有多少个实例。;-)我有一个答案,你可以在这里参考
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)
}