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

Как получить перечисление из необработанного значения в Swift?

Я пытаюсь получить тип перечисления из необработанного значения:

enum TestEnum: String {
    case Name
    case Gender
    case Birth

    var rawValue: String {
        switch self {
        case .Name: return "Name"
        case .Gender: return "Gender"
        case .Birth: return "Birth Day"
        }
    }
}

let name = TestEnum(rawValue: "Name")       //Name
let gender = TestEnum(rawValue: "Gender")   //Gender

Но кажется, что rawValue не работает для строки с пробелами:

let birth = TestEnum(rawValue: "Birth Day") //nil

Любые предложения, как его получить?

4b9b3361

Ответ 1

Слишком сложно, просто назначьте необработанные значения непосредственно в случаях

enum TestEnum: String {
  case Name = "Name"
  case Gender = "Gender"
  case Birth = "Birth Day"
}

let name = TestEnum(rawValue: "Name")!       //Name
let gender = TestEnum(rawValue: "Gender")!   //Gender
let birth = TestEnum(rawValue: "Birth Day")! //Birth

Если имя case совпадает с исходным значением, вы можете даже опустить его

enum TestEnum: String {
  case Name, Gender, Birth = "Birth Day"
}

Ответ 2

Полный рабочий пример:

enum TestEnum: String {
    case name = "A Name"
    case otherName
    case test = "Test"
}

let first: TestEnum? = TestEnum(rawValue: "A Name")
let second: TestEnum? = TestEnum(rawValue: "OtherName")
let third: TestEnum? = TestEnum(rawValue: "Test")

print("\(first), \(second), \(third)")

Все они будут работать, но при инициализации с использованием необработанного значения он будет необязательным. Если это проблема, вы можете создать инициализатор или конструктор для перечисления, чтобы попытаться обработать это, добавив случай "Нет" и вернув его, если невозможно создать перечисление. Что-то вроде этого:

static func create(rawValue:String) -> TestEnum {
        if let testVal = TestEnum(rawValue: rawValue) {
            return testVal
        }
        else{
            return .none
        }
    }

Ответ 3

Вы можете определить enum, как это -

enum TestEnum: String {
    case Name, Gender, Birth
}

ИЛИ

enum TestEnum: String {
    case Name
    case Gender
    case Birth
}

вы можете предоставить метод init, который по умолчанию относится к одному из значений элемента.

enum TestEnum: String {
    case Name, Gender, Birth

    init() {
        self = .Gender
    }
}

В приведенном выше примере TestEnum.Name имеет неявное исходное значение "Имя" и т.д.

Вы получаете доступ к необработанному значению случая перечисления со свойством rawValue:

let testEnum = TestEnum.Name.rawValue
// testEnum is "Name"
let testEnum1 = TestEnum() 
// testEnum1 is "Gender"