Я хочу вернуть rawValue в RawRepresentable как Any, но я получаю его только как Any
Поэтому у меня есть функция, которая получает Any
и проверяет, является ли Any перечислением, используя отражение:
func extractRawValue(subject: Any) throws -> Any {
let mirror = Mirror(reflecting: subject)
guard let displayStyle = mirror.displayStyle,
case .`enum` = displayStyle else {
throw Errors.NoEnum
}
// And from here I don't know how to go any further...
// I wish I could do something like this:
guard let subject = subject as? RawRepresentable where let rawValue = subject.rawValue as Any else {
throw Errors.NoRawRepresenable
}
return rawValue
}
Кто-нибудь знает, как я могу сделать что-то подобное?
1 ответ
Я думаю, что Swifty способ сделать это - использовать протокол для перечислений, которые вы хотите использовать:
protocol ValueAsAnyable {
func valueAsAny() -> Any
}
extension ValueAsAnyable where Self: RawRepresentable {
func valueAsAny() -> Any {
return rawValue as Any
}
}
func extractRawValue(subject: Any) throws -> Any {
let mirror = Mirror(reflecting: subject)
guard let displayStyle = mirror.displayStyle,
case .`enum` = displayStyle else {
throw Errors.NoEnum
}
guard let anyable = subject as? ValueAsAnyable else {
throw Errors.NoRawRepresentable
}
return anyable.valueAsAny()
}
let subject: Any = TestEnum.test
let thing = try? extractRawValue(subject: subject) //prints "test"
Это должно позволить вам делать то, что вам нужно, но сохранять безопасность типов.