Мне нужен какой-то тип enum, который может принимать любые StringLiteralType
, в которых мне не нужно создавать много шаблонного кода.
Вот пример кода, который у меня есть.
enum Sample: RawRepresentable {
case foo
case bar
case unknown(String)
init?(rawValue: String) {
if let correspondingValue = Key(rawValue: rawValue)?.correspondingValue {
self = correspondingValue
} else {
self = .unknown(rawValue)
}
}
private enum Key: String {
case foo
case bar
var correspondingValue: Sample {
switch self {
case .foo: return .foo
case .bar: return .bar
}
}
init?(withSample sample: Sample) {
switch sample {
case .foo: self = .foo
case .bar: self = .bar
case .unknown: return nil
}
}
}
var rawValue: String {
switch self {
case let .unknown(value): return value
default: return Key(withSample: self)?.rawValue ?? ""
}
}
}
Я хочу иметь определенные случаи (foo, bar и т. Д.), В которых есть значения по умолчанию, которые я могу использовать для переключения, а затем я хочу получить unkown(String)
, который может содержать любое значение.
Это можно легко сделать, просто используя String
и какой-нибудь Constants
, например, подобный этому.
enum Constants {
static let foo = "foo"
static let bar = "bar"
}
// sample usage
let someString = "aaaa"
let sample = Sample(rawValue: someString)! // don't mind the implicit unwrapping
switch sample {
case Constants.foo:
// do something
case Constants.bar:
// do something
default:
// do something with unknown someString
}
Идея здесь в том, чтобы иметь возможность использовать пример таким образом.
let someString = "aaaa"
let sample = Sample(rawValue: someString)! // don't mind the implicit unwrapping
switch sample {
case .foo:
// do something
case .bar:
// do something
case .unknown(let value):
// do something
}
РЕДАКТИРОВАТЬ:
Почему это должно быть Enum - Автозаполнение в XCode с использованием перечислений - Добавление функциональности будет легко при добавлении новых случаев при использовании switch
Почему это должно быть RawRepresentable
- Это сохраняется для сохранения через RawValue
.- Я также могу использовать протоколы под ExpressibleByXXXXXXLiteral
, делая это.