Design patterns 如何在不引发异常的情况下将对象映射到Swift中的枚举

Design patterns 如何在不引发异常的情况下将对象映射到Swift中的枚举,design-patterns,swift,Design Patterns,Swift,我有一些数组需要映射到枚举数组: let planets = ["Earth", "Mars", "Venus"] enum Planet { case Earth case Mars case Venus } 阵列经过审查(例如,我在转换前对其进行筛选) 现在,在我的映射函数中 func stringToPlanet(planetStr: String) -> Planet { switch planetStr { ... default: r

我有一些数组需要映射到枚举数组:

let planets = ["Earth", "Mars", "Venus"]

enum Planet {
  case Earth
  case Mars
  case Venus
}
阵列经过审查(例如,我在转换前对其进行筛选)

现在,在我的映射函数中

func stringToPlanet(planetStr: String) -> Planet {
  switch planetStr {
  ...
    default:
      return ???
  }
}
我必须在默认部分中返回一些内容,因此我有以下选项:

  • 向枚举添加一个“未知”行星(但我100%知道枚举中的所有行星都是已知的)
  • 返回地球?和.None默认值(最干净,但接下来我需要非可选的枚举,我必须使用展开进行过滤。包装/展开性能如何?我有一个调用此函数的紧密循环。)
  • 返回。接地(功能外的满意结果,但eew)

如果这是另一种语言,我会扔到这里,因为我知道这永远不会发生。您对这里的最佳模式有什么看法?

您可以使用
fromRaw
功能

enum Planet : String {
    case Earth = "Earth";
    case Mars = "Mars";
    case Venus = "Venus";
}


var f = Planet.fromRaw("Earth")

f == Planet.Earth  // true
如果设备名称无效,
f
将设置为零


苹果文档中的更多信息如下:

另一种让编译器满意的方法是断言失败:

func stringToPlanet(planetStr: String) -> Planet {
  switch planetStr {
  ...
  default:
    assertionFailure("Wow, new planet")
  }
}

这样,您就不必用原始值污染您漂亮的枚举;)

还应注意,您不需要显式地设置
enum
String
值。