按索引访问字符串枚举

时间:2016-09-03 09:02:45

标签: swift enums

我在C中有一个枚举,索引需要用String表示。

整数索引如何使用Swift枚举的String类型?

我想将枚举复制到Swift,将类型设置为字符串并定义所有原始值以显示文本,然后使用C enum值提取Swift String枚举的原始值文本。

否则我只会创建一个字符串数组..但枚举更有用。

4 个答案:

答案 0 :(得分:33)

在Swift中,枚举类型不包含案例的索引信息(至少,不为程序员提供)。

所以:

整数索引如何使用Swift枚举的String类型?

答案是"你不能"。

除了创建字符串数组之外,您可以通过多种方式绑定Int(或枚举案例)和String值。

例如,如果绑定的字符串可以与案例标签相同,则可以这样写:

enum MyEnum: Int {
    case foo
    case bar
    case baz

    var string: String {
        return String(self)
    }
}

if let value = MyEnum(rawValue: 0) {
    print(value.string) //->foo
}

如果你的字符串需要更复杂来显示文本,你可以使用Swift Dictionary来绑定枚举案例和字符串。

enum AnotherEnum: Int {
    case foo
    case bar
    case baz

    static let mapper: [AnotherEnum: String] = [
        .foo: "FooString",
        .bar: "BarString",
        .baz: "BazString"
    ]
    var string: String {
        return AnotherEnum.mapper[self]!
    }
}

if let value = AnotherEnum(rawValue: 1) {
    print(value.string) //->BarString
}

比简单的字符串数组更具可读性。

答案 1 :(得分:13)

简单的解决方法,如果您想枚举字符串枚举,这也很有用。

enum MyEnum: String {
    case foo = "fooString"
    case bar = "barString"
    case baz = "bazString"

    static let allValues = [foo, bar, baz] //must maintain second copy of values
}

//enumeration advantage
for value in MyEnum.allValues {
    print(value)
}

//get value by index
let value = MyEnum.allValues[1] 

print(value) //barString

答案 2 :(得分:8)

Swift 4.2 引入了CaseIterable,它的功能完全相同,而无需声明allValues数组。它是这样的:

enum MyEnum: String, CaseIterable {
    case foo = "fooString"
    case bar = "barString"
    case baz = "bazString"
}

,您可以通过

访问它的值
MyEnum.allCases

或特定索引处的值

MyEnum.allCases[index]

答案 3 :(得分:0)

您可以添加索引作为枚举的一部分。

enum StringEnum: String, CaseIterable {
   case pawn, rook, knight, bishop, king, queen

   var name: String { self.rawValue.uppercased() }
   var index: Int { StringEnum.allCases.firstIndex(of: self) ?? 0 }
}

并使用函数通过索引查找枚举案例:

func findEnum(by index: Int) -> StringEnum? {
   StringEnum.allCases.first(where: { $0.index == index })
}