首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果value为`RawRepresentable`,如何从`Any`中提取`rawValue`

如果value为`RawRepresentable`,如何从`Any`中提取`rawValue`
EN

Stack Overflow用户
提问于 2019-04-02 21:57:17
回答 1查看 149关注 0票数 1

我正在寻找类似这样的东西:

代码语言:javascript
复制
func extractRawValue(fromPossibleRawRepresentable value: Any) -> Any? {
    return (value as? RawRepresentable)?.rawValue
}

我不介意提取的RawValue需要是静态类型...

代码语言:javascript
复制
func extractRawValue<T: RawRepresentable, U>(fromPossibleRawRepresentable value: Any, expecting: U.Type) -> U? where T.RawValue == U {
    return (value as? T)?.rawValue
}

上下文:我希望在镜像中收集原始值而不是实际值。

代码语言:javascript
复制
let d = Mirror(reflecting: self).children.reduce(into: [String: String](), {
    guard let label = $1.label else {
        return
    }
    $0[label] = extractRawValue(fromPossibleRawRepresentable: $1.value)
}
EN

回答 1

Stack Overflow用户

发布于 2019-04-05 23:54:30

问题是RawRepresentable有一个associatedtype,所以你不能给它赋值Any。您也不能将其用作泛型类型,因为这样您就必须在函数签名中使用具体类型本身,这就违背了这个目的。

您可以使用以下命令相当容易地绕过这些问题:

代码语言:javascript
复制
protocol RawString {
    var rawValue: String { get }
}

这将允许您使用以下命令提取值:

代码语言:javascript
复制
func extractRawValue(value: Any) -> String? {
    return (value as? RawString)?.rawValue
}

对于您想要从中提取rawValue作为String的任何类型,只需向其添加符合RawString的内容,例如

代码语言:javascript
复制
enum Foo: String, RawString {}

// or

struct StringContainer: RawString {
   var rawValue: String
}

这种方法的缺点是,您需要显式地标记每个类型以符合RawString,但不幸的是,我看不到任何其他方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55476630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档