如何在Swift中将对象映射到枚举而不抛出异常

时间:2014-09-26 00:42:48

标签: design-patterns swift

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

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

enum Planet {
  case Earth
  case Mars
  case Venus
}

对数组进行审查(例如,我在转换前对其进行过滤)

现在,在我的映射函数中

func stringToPlanet(planetStr: String) -> Planet {
  switch planetStr {
  ...
    default:
      return ???
  }
}

我必须在默认部分返回一些内容,因此我有以下选项:

  • 在enum中添加一个“未知”的行星(但我知道100%我的枚举中的所有行星都是已知的)
  • 回归星球?默认情况下没有(最干净,但是我需要非可选的枚举,我必须通过解包来过滤。包装/解包性能怎么样?我有一个调用此函数的紧密循环。)
  • 返回.Earth(功能以外的满意结果,但是eew)

如果这是另一种语言,我会在这里知道它永远不会发生。你对这里最好的模式有什么看法?

2 个答案:

答案 0 :(得分:2)

您可以使用fromRaw功能

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


var f = Planet.fromRaw("Earth")

f == Planet.Earth  // true

如果工厂名称无效,f将设置为nil

Apple doc中的更多信息:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-XID_228

答案 1 :(得分:0)

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

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

这样您就不必使用原始值污染您的好枚举;)