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
值。