是否可以通過編程的方式找出Enum在Swift 2中有多少個「案例」並迭代它們?Enum的反省和迭代
此代碼不能編譯,但它給喲我想要實現一個想法:
enum HeaderStyles{
case h1
case h2
case h3
}
for item in HeaderStyles{
print(item)
}
是否可以通過編程的方式找出Enum在Swift 2中有多少個「案例」並迭代它們?Enum的反省和迭代
此代碼不能編譯,但它給喲我想要實現一個想法:
enum HeaderStyles{
case h1
case h2
case h3
}
for item in HeaderStyles{
print(item)
}
您可以編寫一個提供該迭代功能的通用結構。在下面的例子中,枚舉原始值必須從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)
}
遍歷所有的情況下,最簡單的方法是使返回的一個計算的屬性他們的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 {
// ...
}
枚舉必須在編譯時聲明,因此您 - 開發人員 - 確切知道枚舉具有多少個案例。 ;-) – vadian