gpt4 book ai didi

swift - if-let Any 到 RawRepresentable

转载 作者:可可西里 更新时间:2023-11-01 00:57:13 25 4
gpt4 key购买 nike

让我们假设:

enum MyEnum: String { case value }
let possibleEnum: Any = MyEnum.value
if let str = stringFromPossibleEnum(possibleEnum: possibleEnum)

在不知道枚举类型名称的情况下实现 stringFromPossibleEnum 的最佳选择是什么?

func stringFromPossibleEnum(possibleEnum: Any) -> String? {
// how should this be implemented without knowing enum type name?
}

UPD: 好的,情况越来越好,有了这个我可以判断 possibleEnum 是否是一个枚举:

if Mirror(reflecting: possibleEnum).displayStyle == .enum { print("yes!") }

但是如何判断这是不是一个基于 String 的枚举呢?

UPD: this tweet建议您可以从 Enum 中获取 rawValue 作为 Any。然后您可能可以检查 rawValue 是否为 String。但是如何从Mirror获取rawValue呢?

最佳答案

好的,所以目前这基本上是开箱即用的,因为你不能 as?-cast 到 RawRepresentableMirror 不为枚举提供 rawValue

我认为最好的办法是制定自己的协议(protocol),为基于StringRawRepresentable 提供默认实现并手动符合所有枚举像这样:

假设这些是枚举:

enum E1: String { case one }
enum E2: String { case two }
enum E3: String { case three }

StringRawRepresentable 协议(protocol)和默认实现:

protocol StringRawRepresentable {
var stringRawValue: String { get }
}

extension StringRawRepresentable
where Self: RawRepresentable, Self.RawValue == String {
var stringRawValue: String { return rawValue }
}

使所有需要的现有枚举符合协议(protocol):

extension E1: StringRawRepresentable {}
extension E2: StringRawRepresentable {}
extension E3: StringRawRepresentable {}

现在我们可以转换为 StringRawRepresentable:

func stringFromPossibleEnum(possibleEnum: Any) -> String? {
if let e = possibleEnum as? StringRawRepresentable { return e.stringRawValue }
return nil
}

stringFromPossibleEnum(possibleEnum: E2.two as Any)

关于swift - if-let Any 到 RawRepresentable<String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43666118/

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