gpt4 book ai didi

swift - 我想将 RawRepresentable 的 rawValue 作为 Any 返回,但我只将它作为 Any 接收

转载 作者:搜寻专家 更新时间:2023-11-01 07:18:25 25 4
gpt4 key购买 nike

所以我有一个接收 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
}

有谁知道我怎样才能完成这样的事情?

最佳答案

我认为执行此操作的 Swifty 方法是为您要使用的枚举使用协议(protocol):

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"

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

关于swift - 我想将 RawRepresentable 的 rawValue 作为 Any 返回,但我只将它作为 Any 接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40535502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com