Проблема в том, что RawRepresentable
имеет associatedtype
, поэтому вы не можете присвоить Any
ему.Вы также не можете использовать его как универсальный тип, потому что тогда вы должны будете использовать сам конкретный тип в сигнатуре функции, что противоречит цели.
Вы можете довольно легко обойти эти проблемы, используя:
protocol RawString {
var rawValue: String { get }
}
Это позволит вам извлечь значения, используя:
func extractRawValue(value: Any) -> String? {
return (value as? RawString)?.rawValue
}
Для любого типа, из которого вы хотите извлечь rawValue
как String
, просто добавьте к нему соответствие RawString
, например
enum Foo: String, RawString {}
// or
struct StringContainer: RawString {
var rawValue: String
}
Недостатками этого подхода является то, что вам необходимо явно пометить каждый тип, чтобы он соответствовал RawString
, но, к сожалению, я не вижу другого пути.