我如何获取Swift枚举的计数?
在Swift 4.2(Xcode 10)中,您可以声明符合CaseIterable
协议,这适用于所有没有关联值的枚举:
enum Stuff: CaseIterable {
case first
case second
case third
case forth
}
现在可以通过以下方式获取枚举的个数:
print(Stuff.allCases.count) // 4
更多信息,请参见:
在最新版本的Swift中,出现了错误"Type 'DAFFlow' does not conform to protocol 'RawRepresentable'"。为什么要强制我遵循这个协议呢?有什么想法吗?
对不起,我忘记提到"DAFFlow"是一个简单的枚举,不继承任何其他协议。
对不起,我正在尝试在Swift 4.1版本中进行。我认为它可能不起作用。
这需要Swift 4.2的最新版本。
这是最好的解决方法,但为了清楚起见 - 一旦Xcode 10(因此Swift 4.2)退出Beta版(大约在2018年9月14日左右),Apple开发人员才能真正开始使用它。
不起作用。请注意,我正在尝试对具有原始类型的枚举进行操作,所以:enum Stuff: String, CaseIterable
。我得到:Instance member 'count' cannot be used on type 'ViewController.myEnum.AllCases' (aka 'Array<ViewController.myEnum>')
好吧...AllCases
不起作用,但allCases
起作用。嗯。
allCases
是方法,必须在类型上调用,即Stuff.allCases
。 AllCases
是allCases
的类型,通常是一个数组。
噢,那AllCases是用来查看数组包含的类型的吗?
您可以在github.com/apple/swift-evolution/blob/master/proposals/…找到详细的细节。但通常情况下,由于编译器的自动类型推断,您不需要显式指定该类型。
我很确定它也适用于Swift 4.0 - 文档说这是Xcode 10的事情,而不是语言版本。我知道,听起来很奇怪...
Xcode 10仅支持Swift 4.2 - 在构建设置中选择的是“语言兼容性版本”。许多新的语言功能可在选择的兼容性版本下使用。
那就是这样了。几周前,我将项目升级到了Swift 4.2,但在那之前我就使用了CaseIterable
,而且它也起作用。
那我就不知道了。
如果枚举符合CaseIterable
,Objective-C调用者是否可以"看到"具有Int原始类型的枚举?
问题的出现的原因:目前没有一种通用的方法来计算Swift枚举类型的成员数量。
解决方法:可以使用枚举的hashValue属性来计算枚举成员的数量,因为hashValue的值是递增的,从零开始,并且其顺序由枚举成员的声明顺序决定。所以,最后一个枚举成员的hash值加一就是枚举成员的数量。但是需要注意这种方法并没有得到官方的验证,所以使用时需要谨慎,有一定的风险。
Xcode 10更新:在枚举中采用CaseIterable协议,它提供了一个静态的allCases属性,其中包含所有枚举成员作为一个集合。只需要使用其count属性来知道枚举有多少个成员。
具体的解决方法如下所示:
enum Test {
case ONE
case TWO
case THREE
case FOUR
static var count: Int { return Test.FOUR.hashValue + 1}
}
以上代码中的count返回4,即枚举Test有4个成员。
另外,还可以使用rawValue属性替换hashValue属性,但需要在枚举成员中显式设置rawValue的值。
目前没有官方提供的方法来获取Swift枚举的成员数量,但可以通过使用hashValue或rawValue属性来实现。然而,这些方法都有一定的风险和限制,需要谨慎使用。