2015-08-25 44 views
3

是否可以通過編程的方式找出Enum在Swift 2中有多少個「案例」並迭代它們?Enum的反省和迭代

此代碼不能編譯,但它給喲我想要實現一個想法:

enum HeaderStyles{ 

    case h1 
    case h2 
    case h3 
} 

for item in HeaderStyles{ 
    print(item) 
} 
+1

枚舉必須在編譯時聲明,因此您 - 開發人員 - 確切知道枚舉具有多少個案例。 ;-) – vadian

回答

3

您可以編寫一個提供該迭代​​功能的通用結構。在下面的例子中,枚舉原始值必須從0開始(默認情況下它是這樣做的)並且在原始值之間沒有間隔(不能有原始值,例如0,1,2,3,5-4缺失)

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) 
} 
5

遍歷所有的情況下,最簡單的方法是使返回的一個計算的屬性他們的Array

enum SomeEnum { 
    case Zero, One, Two 

    static var allCases: [SomeEnum] { 
     return [.Zero, .One, .Two] 
    } 
} 

如果你想自動陣列可以使用Int作爲rawValue所以你沒有,如果你添加一個額外的case更改任何代碼:

斯威夫特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 
     }) 
    } 
} 

斯威夫特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 { 
    // ... 
}