在Swift中循环遍历Objective-C枚举?

3

我希望能够循环遍历一个在Objective-C中定义的枚举类型,使用Swift进行操作。

现在Objective-C的定义如下:

typedef NS_ENUM(NSInteger, Enum) { A, B, C };

如果我尝试使用for e in Enum,Swift编译器会返回以下错误信息(在Xcode 6.1.1中):

Type 'Enum.Type' does not conform to protocol Sequence.Type

什么是缺失的?如果可能的话,我该如何让这个枚举表现为一个序列?
1个回答

2
在C语言中,因此也在Objective-C语言中,枚举被定义为具有以下行为:

如果第一个枚举没有等号(=),它的枚举常量值为0。每个后续没有等号的枚举都将其枚举常量定义为通过将前一个枚举常量的值加1得到的常量表达式的值。

因此,在您的情况下,您可以这样做:
for enumerationValue in A...C

如果枚举更复杂,那么你需要做一些更复杂的事情。C通常不会对任何东西进行内省,包括枚举,所以如果它更像:
typedef NS_ENUM(NSInteger, Enum) { A, B = 26, C, D = -9 };

那么你可能需要创建一个包含A、B、C和D的字面数组,并对其进行枚举。


但是显然Swift允许以我尝试的方式循环一些枚举(请参见此处)。所以你是说用基于Objective-C的枚举也没有(直接)实现这个的方法,对吗?此外,对于for e in A ... C,我得到了未解决的标识符A,而对于for e in .A ... .C,我得到了ClosedInterval<T>没有名为'Generator'的成员 - Drux
根据您目前的输入,这是我能够实现的最佳结果:for eAsInt in Enum.A.rawValue ..< Enum.C.rawValue { let e = Enum(rawValue:eAsInt) /* ... */ } - Drux
1
请注意,你所参考的问题中,实际上是在定义一个名为allValues的数组,其中包含了所有可能的值,并对Enum.allValues进行迭代,这本质上就是@tommy的答案中最后一段所建议的方法。 - David Berry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接