我正在寻找类似这样的东西:
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
}上下文:我希望在镜像中收集原始值而不是实际值。
let d = Mirror(reflecting: self).children.reduce(into: [String: String](), {
guard let label = $1.label else {
return
}
$0[label] = extractRawValue(fromPossibleRawRepresentable: $1.value)
}发布于 2019-04-05 23:54:30
问题是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,但不幸的是,我看不到任何其他方法。
https://stackoverflow.com/questions/55476630
复制相似问题