我想将 RawRepresentable 的原始值作为 Any 返回,但我只将其作为 Any 接收



所以我有一个接收Any的函数,它通过反射检查Any是否为enum:

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"

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

相关内容

  • 没有找到相关文章

最新更新