【问题标题】:How to extract `rawValue` from `Any` if value is `RawRepresentable`如果值为`RawRepresentable`,如何从`Any`中提取`rawValue`
【发布时间】:2019-04-02 13:57:16
【问题描述】:

我正在寻找类似的东西:

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)
}

【问题讨论】:

    标签: swift generics reflection


    【解决方案1】:

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

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

    protocol RawString {
        var rawValue: String { get }
    }
    

    这将允许您使用以下方法提取值:

    func extractRawValue(value: Any) -> String? {
        return (value as? RawString)?.rawValue
    }
    

    对于您要从中提取rawValueString 的任何类型,只需添加与RawString 的一致性,例如

    enum Foo: String, RawString {}
    
    // or
    
    struct StringContainer: RawString {
       var rawValue: String
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多