枚举的自省和迭代
Introspection and iteration on an Enum
是否可以通过编程找出一个枚举在 Swift 2 中有多少 "cases" 并迭代它们?
此代码无法编译,但它让您了解我要实现的目标:
enum HeaderStyles{
case h1
case h2
case h3
}
for item in HeaderStyles{
print(item)
}
遍历所有情况的最简单方法是计算 属性 其中 returns 其中 Array
个:
enum SomeEnum {
case Zero, One, Two
static var allCases: [SomeEnum] {
return [.Zero, .One, .Two]
}
}
如果你想要一个自动数组,你可以使用 Int
作为 rawValue 这样你就不必更改任何代码,如果你添加额外的 case
:
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)
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)
}
是否可以通过编程找出一个枚举在 Swift 2 中有多少 "cases" 并迭代它们?
此代码无法编译,但它让您了解我要实现的目标:
enum HeaderStyles{
case h1
case h2
case h3
}
for item in HeaderStyles{
print(item)
}
遍历所有情况的最简单方法是计算 属性 其中 returns 其中 Array
个:
enum SomeEnum {
case Zero, One, Two
static var allCases: [SomeEnum] {
return [.Zero, .One, .Two]
}
}
如果你想要一个自动数组,你可以使用 Int
作为 rawValue 这样你就不必更改任何代码,如果你添加额外的 case
:
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)
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)
}