Swift 我想返回一个可表示的';它的原始值是Any,但我只作为Any接收它

Swift 我想返回一个可表示的';它的原始值是Any,但我只作为Any接收它,swift,reflection,enums,rawrepresentable,Swift,Reflection,Enums,Rawrepresentable,因此,我有一个函数,它接收一个Any,并使用反射检查Any是否为枚举: func extractRawValue(subject: Any) throws -> Any { let mirror = Mirror(reflecting: subject) guard let displayStyle = mirror.displayStyle, case .`enum` = displayStyle else { throw Err

因此,我有一个函数,它接收一个
Any
,并使用反射检查Any是否为枚举:

func extractRawValue(subject: Any) throws -> Any {
    let mirror = Mirror(reflecting: subject)

    guard let displayStyle = mirror.displayStyle,
        case .`enum` = displayStyle else {
            throw Errors.NoEnum
    }

    // And from here I don't know how to go any further...
    // I wish I could do something like this:
    guard let subject = subject as? RawRepresentable where let rawValue = subject.rawValue as Any else {
        throw Errors.NoRawRepresenable
    }

    return rawValue 
}

有人知道我怎样才能做到这一点吗?

我认为最快捷的方法是对要使用的枚举使用协议:

protocol ValueAsAnyable {
    func valueAsAny() -> Any
}

extension ValueAsAnyable where Self: RawRepresentable {
    func valueAsAny() -> Any {
        return rawValue as Any
    }
}

func extractRawValue(subject: Any) throws -> Any {
    let mirror = Mirror(reflecting: subject)

    guard let displayStyle = mirror.displayStyle,
        case .`enum` = displayStyle else {
            throw Errors.NoEnum
    }
    guard let anyable = subject as? ValueAsAnyable else {
        throw Errors.NoRawRepresentable
    }
    return anyable.valueAsAny()
}

let subject: Any = TestEnum.test
let thing = try? extractRawValue(subject: subject) //prints "test"

这应该允许您做您需要的事情,但要保持类型安全。

什么问题是
guard let subject=subject as?RawRepresentable,其中让rawValue=subject.rawValue作为任何试图询问的
?我看到第一部分问这个东西是否是一个可表示的东西,但我无法想象第二部分是什么意思。帮帮我,你成功了吗?我试图在这里找到类似的东西:啊,是的,我忘了说,但重点是不必这么做。我添加了一个扩展,它将自动实现它,所以它只是将它添加到您的枚举声明中。在斯威夫特增加更多活力或更好的反映之前,这是你能得到的最接近的。