【发布时间】:2018-01-01 22:46:05
【问题描述】:
我有各种各样的枚举,如下所示。
enum PaperOrientation : Int { case portrait, landscape }
enum MetricType : Int { case inches, metric }
我创建了 Int 类型的枚举,以便实例的值可以使用 CoreData 保存为数字。
当从 CoreData 检索值以在程序中使用时,我最终得到了非常相似的转换例程,如下所示。
通常,我想要一些默认值 - 例如,它是最新版本程序的新枚举,并且该变量的值实际上可能没有保存在 CoreData 中。例如,为程序的第二个版本添加了 MetricType。检索在 rev 1 中创建的论文将不会保存度量值。对于 nil 值,我想使用论文最初假定的默认值。
class ConversionRoutine {
class func orientationFor(_ num: NSNumber?) -> PaperOrientation {
if let iVal = num?.intValue {
if let val = PaperOrientation(rawValue: iVal) {
return val
}
}
return PaperOrientation(rawValue: 0)!
}
class func metricTypeFor(_ num: NSNumber?) -> MetricType {
if let iVal = num?.intValue {
if let val = MetricType(rawValue: iVal) {
return val
}
}
return MetricType(rawValue: 0)!
}
}
有没有办法减少冗余?
我在下面介绍了一种效果很好的方法。但欢迎进行更多改进或改进。
【问题讨论】:
-
return PaperOrientation(rawValue: num?.intValue ?? 0) ?? .portrait -
或者不要将您的 num 声明为可选的 NSNumber,只需为其分配一个默认值
func orientationFor(_ num: NSNumber = 0)和return PaperOrientation(rawValue: num.intValue) ?? .portrait -
可以清理一些转换例程。我喜欢第一个回复中的单线。但主要是,我对减少整体代码量很感兴趣——到目前为止,我发现在下面的答案中可以通过协议扩展来完成。此外,在这种特殊情况下,我关心来自 CoreData 的数据,其中数据是可选的。对于我的一个应用程序,我可能有 30 个(并且还在不断增加)从 CoreData 转换数据的案例。到目前为止,创建 IntDefaultable 协议确实简化了新案例的定义和使用。但仍在寻找潜在的改进。
标签: swift generics core-data enums