Подтвердить что ты не робот

В Swift можно преобразовать строку в перечисление?

Если у меня есть перечисление с случаями a, b, c, d, возможно ли, чтобы я произнес строку "a" как перечисление?

4b9b3361

Ответ 1

Конечно. У перечислений может быть необработанное значение. Чтобы процитировать документы:

Необработанные значения могут быть строками, символами или любыми целыми или числа с плавающей запятой

- Отрывок из: Apple Inc. "Язык быстрого программирования". интерактивные книги. https://itun.es/us/jEUH0.l,

Итак, вы можете использовать такой код:

enum StringEnum: String 
{
  case one = "one"
  case two = "two"
  case three = "three"
}

let anEnum = StringEnum(rawValue: "one")!

print("anEnum = \"\(anEnum.rawValue)\"")

Примечание. После каждого случая вам не нужно писать = "один" и т.д. Строковые значения по умолчанию совпадают с именами, поэтому вызов .rawValue будет просто возвращать строку

ИЗМЕНИТЬ

Если вам нужно, чтобы строковое значение содержало такие вещи, как пробелы, которые недопустимы как часть значения case, вам необходимо явно установить строку. Таким образом,

enum StringEnum: String 
{
  case one
  case two
  case three
}

let anEnum = StringEnum.one
print("anEnum = \"\(anEnum)\"")

дает

anEnum = "one"

Но если вы хотите, чтобы case one отображал "значение один", вам нужно указать строковые значения:

enum StringEnum: String 
{
  case one   = "value one"
  case two   = "value two"
  case three = "value three"
}

Ответ 2

Все, что вам нужно, это:

enum Foo: String {
   case a, b, c, d
}

let a = Foo(rawValue: "a")
assert(a == Foo.a)

let 💩 = Foo(rawValue: "💩")
assert(💩 == nil)

Ответ 3

В случае с перечислением с типом Int вы можете сделать это так:

enum MenuItem: Int {
    case One = 0, Two, Three, Four, Five //... as much as needs

    static func enumFromString(string:String) -> MenuItem? {
        var i = 0
        while let item = MenuItem(rawValue: i) {
            if String(item) == string { return item }
            i += 1
        }
        return nil
    }
}

И используйте:

let string = "Two"
if let item = MenuItem.enumFromString(string) {
    //in this case item = 1 
    //your code
} 

Ответ 4

Расширение ответа Duncan C

extension StringEnum: StringLiteralConvertible {

    init(stringLiteral value: String){
        self.init(rawValue: value)!
    }

    init(extendedGraphemeClusterLiteral value: String) {
        self.init(stringLiteral: value)
    }

    init(unicodeScalarLiteral value: String) {
        self.init(stringLiteral: value)
    }
}