Как получить перечисление из необработанного значения в 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
Любые предложения, как его получить?
Ответы
Ответ 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"