作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找类似的东西:
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)
}
最佳答案
问题是 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
,但不幸的是我看不到任何其他方式。
关于swift - 如果值为 `rawValue`,如何从 `Any` 中提取 `RawRepresentable`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55476630/
我是一名优秀的程序员,十分优秀!