【问题标题】:Looping over Objective-C enum in Swift?在 Swift 中循环 Objective-C 枚举?
【发布时间】:2015-01-26 19:55:39
【问题描述】:

我想循环使用最初在 Objective-C 中使用 Swift 定义的 enum

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

缺少什么?如果可能的话,我怎样才能让这个枚举表现为一个序列?

【问题讨论】:

    标签: objective-c swift for-loop enums


    【解决方案1】:

    在 C 中,因此在 Objective-C 中,enums 被定义为具有这种行为:

    如果第一个枚举数没有=,则其枚举值 常数为 0。没有 = 的每个后续枚举数定义其 枚举常量作为得到的常量表达式的值 通过将前一个枚举常量的值加 1。

    所以在你的情况下你可以这样做:

    for enumerationValue in A...C
    

    如果enum 更复杂,那么您需要做一些更复杂的事情。 C 通常不提供对任何东西的自省,包括枚举,所以如果它更像:

    typedef NS_ENUM(NSInteger, Enum) { A, B = 26, C, D = -9 };
    

    那么您可能就要创建一个由 A、B、C 和 D 组成的文字数组,并通过它进行枚举。

    【讨论】:

    • 但显然 Swift 允许以我尝试的方式循环一些枚举(参见 here)。所以你是说没有(直接的)方法可以使用基于 Objective-C 的枚举来实现这一点,对吧?另外,我得到unresolved identifier A 对应for e in A ... CClosedInterval<T> does not have a member named 'Generator' 对应for e in .A ... .C
    • 这是我目前为止根据您的输入所能达到的最佳效果:for eAsInt in Enum.A.rawValue ..< Enum.C.rawValue { let e = Enum(rawValue:eAsInt) /* ... */ }
    • 请注意,在您引用的问题中,他们实际上定义了一个数组allValues,其中包含所有可能值的显式列表,然后迭代Enum.allValues,这基本上是@ 的最后一段汤米的回答表明。
    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多