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