Swift 枚举上的内省和迭代
是否可以通过编程找出Swift 2中一个枚举有多少个“案例”并对其进行迭代 这段代码不会编译,但它让你了解我要实现的目标: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
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)
}