Swift 如果值是`RawRepresentable',如何从`Any`中提取`rawValue``

Swift 如果值是`RawRepresentable',如何从`Any`中提取`rawValue``,swift,generics,reflection,Swift,Generics,Reflection,我要找的东西是: func extractRawValue(fromPossibleRawRepresentable value: Any) -> Any? { return (value as? RawRepresentable)?.rawValue } 我不介意提取的RawValue是否需要为静态类型 func extractRawValue<T: RawRepresentable, U>(fromPossibleRawRepresentable value: A

我要找的东西是:

func extractRawValue(fromPossibleRawRepresentable value: Any) -> Any? {
    return (value as? RawRepresentable)?.rawValue
}
我不介意提取的
RawValue
是否需要为静态类型

func extractRawValue<T: RawRepresentable, U>(fromPossibleRawRepresentable value: Any, expecting: U.Type) -> U? where T.RawValue == U {
    return (value as? T)?.rawValue
}

问题是,
RawRepresentable
有一个
associatedtype
,因此您不能为它分配
任何
。您也不能将其作为泛型类型使用,因为这样您就必须在函数签名中使用具体类型本身,这与此目的背道而驰

您可以使用以下方法相当轻松地规避这些问题:

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
,但不幸的是,我看不到任何其他方法。

问题是
rawsrepresentable
有一个
关联类型
,因此您无法将
任何
分配给它。您也不能将其作为泛型类型使用,因为这样您就必须在函数签名中使用具体类型本身,这与此目的背道而驰

您可以使用以下方法相当轻松地规避这些问题:

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
,但不幸的是,我看不到任何其他方法