Вы можете создать частное Inner
перечисление. Реализация немного повторяема, но понятна и проста. 1 строка rawValue
, 2 строки init
, которые всегда выглядят одинаково. Inner
имеет метод, возвращающий «внешний» эквивалент, и наоборот.
Имеет ли дополнительное преимущество то, что вы можете напрямую сопоставить случай перечисления с String
, в отличие от других ответов здесь.
Пожалуйста, приветствуйте этот ответ, если вы знаете, как решить проблему повторяемости с помощью шаблонов, у меня нет времени смешаться с ней прямо сейчас.
@objc enum MyEnum: NSInteger, RawRepresentable, Equatable {
case
option1,
option2,
option3
// MARK: RawRepresentable
var rawValue: String {
return toInner().rawValue
}
init?(rawValue: String) {
guard let value = Inner(rawValue: rawValue)?.toOuter() else { return nil }
self = value
}
// MARK: Obj-C support
private func toInner() -> Inner {
switch self {
case .option1: return .option1
case .option3: return .option3
case .option2: return .option2
}
}
private enum Inner: String {
case
option1 = "option_1",
option2 = "option_2",
option3 = "option_3"
func toOuter() -> MyEnum {
switch self {
case .option1: return .option1
case .option3: return .option3
case .option2: return .option2
}
}
}
}