【发布时间】:2018-06-16 01:34:53
【问题描述】:
给定方法
func enumCaseCount<T: Hashable>(ofType type: T.Type) -> Int {
// Needed check if type is an enum type
return 3
}
如下使用
private enum SimpleEnum: String {
case a = "A"
case b = "B"
case c = "C"
}
enumCaseCount(ofType: SimpleEnum.self)
知道如何检查给定的元类型是否为枚举吗?
可以通过这种方式测试类
class Test {}
Test.self is AnyClass // returns true
【问题讨论】:
-
您想要做的事情是不可能的。首先,没有通用的枚举类型,因为枚举没有共同点,所以你无法检查一个类型是否是枚举。其次,您无法遍历枚举的案例,因此您将无法以编程方式确定枚举有多少案例。请参阅this Q&A,但请注意所有解决方法都要求您的枚举具有特定的原始类型,因此它们不适用于任何任意枚举。
-
一旦 Swift ABI 稳定,您可以 climb through the metadata yourself 执行此操作。不过,我不建议这样做。但是,一旦github.com/apple/swift-evolution/pull/114(希望)终于出现,您就可以使用
ValueEnumerable。 -
@Hamish 很奇怪,我从未见过
ValueEnumerable提案,尽管该公关已经存在了很长一段时间;看起来很整洁。不过最近更新了:你认为我们会看到“很快”吗? (已经在 Swift 4.1 中?) -
@dfri 不幸的是,假设它确实被接受(它甚至还没有被安排审查),它probably won't surface until at least Swift 5。 Swift 4.1 基本完成了(现在只是 bug 修复),所以 def 不会进入那个。
-
@dfri 是的,如果你有兴趣,这里给出了枚举的当前布局细节:github.com/apple/swift/blob/…。请注意,编译器可以使用额外的居民,即不形成枚举的有效值的位模式(以及形成额外居民的备用位)来存储“鉴别器”(值表示的情况),因此额外的字节不会'不必总是为具有关联值的枚举添加:)