我有枚举:
enum RetailDemandReturnOperation {
case salesReturn(value: MSRetailSalesReturnRealm)
case demand(value: MSRetailDemandRealm)
}
MSRetailDemandRealm
和MSRetailDemandRealm
都实现了相同的协议,它们具有变量title和stats。我想提取这些值,但我并不关心实际存储的对象。请考虑以下内容:
switch data! {
case .salesReturn(let object):
titleString = object.title
statistics = object.stats
case .demand(let object):
titleString = object.title
statistics = object.stats
break
}
我必须进入每个枚举值才能获得协议的属性。我有什么方法可以做得更短更清洁?获取相关值,无论它是什么,只要它符合我的协议,并获得协议值? 感谢。
答案 0 :(得分:10)
您可以向枚举中添加一个返回协议的属性。例如:
enum RetailDemandReturnOperation {
case salesReturn(value: MSRetailSalesReturnRealm)
case demand(value: MSRetailDemandRealm)
var realm: MSRetailRealm {
switch self {
case .salesReturn(let realm):
return realm
case .demand(let realm):
return realm
}
}
}
然后,当您想要在枚举的特定值上访问这些属性时,只需使用:
let operation = RetailDemandReturnOperation.salesReturn(value: MSRetailSalesReturnRealm())
let title = operation.realm.title
答案 1 :(得分:0)
由于RetailDemandReturnOperation
始终具有MSRetailRealm
的关联值,因此您可以为其指定类型为RetailDemandReturnOperation
的新属性。然后,您可以删除枚举中的相关值。
enum RetailDemandReturnOperation {
case salesReturn
case demand
}
protocol MSRetailRealm {
var stats: Int { get set }
var title: String { get set }
var operation: RetailDemandReturnOperation { get }
}
struct MSRetailDemandRealm: MSRetailRealm {
//.. your old code
var operation: RetailDemandReturnOperation { return .demand }
}
struct MSRetailSalesReturnRealm: MSRetailRealm {
//.. your old code
var operation: RetailDemandReturnOperation { return .salesReturn }
}
现在,无论采取何种操作,您都可以访问stats
和title
。如果您关心操作,只需访问operation
属性。
func example(object: MSRetailRealm) {
let titleString = object.title
switch object.operation {
case .salesReturn:
break
case .demand:
break
}
}