Доступ к перечислению строки по индексу

У меня есть перечисление в C, и индекс должен быть представлен строкой.

Как можно использовать переменную Swift типа String с помощью целочисленного индекса?

Я хотел бы скопировать перечисление в Swift, установить тип в строку и определить все необработанные значения для отображения текста, а затем использовать значение C перечисления для извлечения текста необработанного значения для перечисления Swift String.

В противном случае я просто создам массив строк. Но перечисление будет более удобным.

Ответ 1

В Swift типы перечислений не содержат информацию об индексе случаев (по крайней мере, не предоставляются для программистов).

Итак:

Как можно использовать переменную Swift типа String с помощью целочисленного индекса?

Ответ: "Вы не можете".


Вы можете привязать значения Int (или перечисления) и String значения разными способами, кроме как просто создать массив строк.

Например, если ваши связанные строки могут совпадать с метками case, вы можете написать примерно следующее:

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
}

Немного читаем, чем простой массив строк.

Ответ 2

Простое обходное решение, которое также полезно, если вы хотите перечислить перечисление строк.

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

Ответ 3

Swift 4.2 представил CaseIterable который делает то же самое без необходимости объявлять массив allValues. Это работает так:

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

и вы можете получить доступ к значениям по

MyEnum.allCases

или значение по определенному индексу

MyEnum.allCases[index]