【问题标题】:Can you convert between enum types in Swift?你能在 Swift 中的枚举类型之间进行转换吗?
【发布时间】:2023-02-23 01:14:35
【问题描述】:

我的项目中有一些代码如下所示:

static func getUrlFromPageType(_ type: PageType) -> UrlConfig? {
    switch type {
    case .helpScreen:
        return .helpScreen
    case .contact:
        return .contact
    case .termsAndConditions:
        return .termsAndConditions
    // etc
    }
}

如此继续下去,还有 20 多个案例。除了两个例外(映射到 nil),返回值的“名称”始终与输入相同,但类型不同。

理想情况下,您可能想在这里使用比枚举更明智的东西,但出于这个问题的目的,假设这是不可能的。

我的问题是:我可以自动从一个枚举映射到另一个枚举,避免 switch 语句吗?

【问题讨论】:

  • Swift 的类型系统大多是名义上的。即使两个枚举具有相同的结构,但就类型系统而言,它们是完全不相关的。您可以使用与 Joakim 相同的支持原始值在它们之间桥接,但除此之外,这些只是恰好具有相同名称的完全不相关的值。宏将来可能会帮助解决这个问题。尽管它回避了一个问题:如果这些具有严格的一对一关系,那么是否有理由首先拥有两个不同的枚举?
  • 为什么你首先有两个枚举?
  • @Alexander 我也同意这样做并没有多大意义。也许最好有某种轻量级实例来处理这两种情况;但不幸的是,出于某些原因,我现在有点被枚举困住了。

标签: swift


【解决方案1】:

如果两个枚举都有一个 String 类型的原始值,或者您可以将它们更改为具有该类型,那么它就非常简单

enum PageType: String {
    case helpScreen
    case contact
    case termsAndConditions
}

enum UrlConfig: String {
    case helpScreen
    case contact
    case termsAndConditions
}

func getUrlFromPageType(_ type: PageType) -> UrlConfig? {
    UrlConfig(rawValue: type.rawValue)
}

【讨论】:

    【解决方案2】:

    我的问题是:我可以自动从一个枚举映射到另一个枚举,避免 switch 语句吗?

    不,我们做一个很多在我们的应用程序中,对于具有很多的案例,并且没有办法解决它:你只需要有一个巨大的开关,将第一个枚举的每个案例映射到第二个枚举的相应案例 - 尽管如何进行映射是非常明显的,因为案例始终具有相同的名称。

    我们的约定是为每个需要转换为另一个的枚举提供一个执行转换的方法。例如:

        enum ConfettiAnimation: String {
            case airborne = "Airborne"
            case anniesBunny = "AnniesBunny"
            // ... 20 more cases
    
            func toEarningsAnimation() -> EarningsAnimation? {
                switch self {
                case .airborne:
                    return .airborne
                case .anniesBunny:
                    return .anniesBunny
                // ... 20 more cases
                }
            }
        }
    

    基本上你只需要像超人穿裤子一样做——就像其他人一样一次一条腿。

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多