枚举:计算并列出所有案例(从外部!)

时间:2019-04-12 10:46:27

标签: ios swift enums

我在自己的文件(“ MyEnum.swift”)中拥有了这个枚举(Xcode 10 / Swift 5):

enum MyEnum: Int, CaseIterable {
    case A = 0
    case B = 1
    case C = 2
    case D = 3
    case E = 4
    //Each case needs its own number and description!

    var description: String {
        switch self {
            case .A:
                return "abc"
            case .B:
                return "bcd"
            case .C:
                return "cde"
            case .D:
                return "def"
            case .E:
                return "efg"
        }
    }
}

...,并想将说明添加到PickerView中。我知道如何为视图设置功能,但是现在我不得不统计枚举案例并添加描述。

根据documentation和其他问题,添加CaseIterable应该可以拨打电话

MyEnum.allCases.count

...但是我只能从枚举文件中访问allCases。从外部(因此从我的ViewController类中),我只能调用MyEnum.AllCases,它没有count,老实说,我什至不确定AllCases到底返回了什么(这不是普通的数组,可以在count上使用)。

将此代码(source)添加到枚举文件中,至少可以计算出这种情况:

static let count: Int = {
    var max: Int = 0
    while MyEnum(rawValue: max) != .none { max += 1 }
    return max
}()

...但是使用Swift 4.2+应该不是一种更简单的方法吗?

如何获取案件说明列表,以用PickerView填充(例如“ abc”,“ bcd”,...-最好不对其进行硬编码)?

4 个答案:

答案 0 :(得分:3)

我尝试了1个文件:

enum TestEnum: CaseIterable {
    case test1
    case test2
}

在我写的另一个类的另一个文件中:

let count = TestEnum.allCases.count

它有效,但是我注意到当我键入“ allCases”时没有显示

enter image description here

我需要手动编写

答案 1 :(得分:1)

allCases被声明为public,因此您应该能够从另一个文件访问它:

/// A collection of all values of this type.
public static var allCases: Self.AllCases { get }

像这样:

let descriptions = MyEnum.allCases.map { $0.description }

尝试清理项目并重建。

此外,如果Xcode的自动完成列表中未包含某些内容,则并不意味着您无法访问该内容。根据我自己的经验,Xcode的完整列表包含大量错误。

答案 2 :(得分:0)

出于完整性考虑,如果allCases根本不起作用(即使重新启动后),请将其添加到枚举文件中:

static let allValues = [MyEnum.A, MyEnum.B, MyEnum.C, MyEnum.D, MyEnum.E]

它经过硬编码,但至少可以让您访问所有内容:

  • 数量:MyEnum.allValues.count
  • 说明(例如“ abc”):MyEnum.allValues[0].description
  • rawValue(例如0):MyEnum.allValues[0].rawValue

答案 3 :(得分:-1)

我也遇到了同样的问题。最终的工作是重新启动xcode。