Если у меня есть перечисление с случаями a, b, c, d, возможно ли, чтобы я произнес строку "a" как перечисление?
В Swift можно преобразовать строку в перечисление?
Ответ 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)
}
}