Ios Swift获取枚举中不带开关的关联值
我有:Ios Swift获取枚举中不带开关的关联值,ios,swift,Ios,Swift,我有: enum RetailDemandReturnOperation { case salesReturn(value: MSRetailSalesReturnRealm) case demand(value: MSRetailDemandRealm) } MSRetailDemandRealm和MSRetailDemandRealm都实现了相同的协议,具有变量title和stats。我想提取这个值,但我不关心实际存储在哪个对象中。考虑如下: switch data! {
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
}
我必须输入每个枚举值才能得到协议的属性。我能不能把它做得更短更干净?获取关联值,无论它是什么,只要它符合我的协议,并获取协议值?
谢谢。您可以向枚举中添加一个返回协议的属性。例如:
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
由于
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
,无论它是什么操作。如果您关心操作,只需访问操作
属性即可
func example(object: MSRetailRealm) {
let titleString = object.title
switch object.operation {
case .salesReturn:
break
case .demand:
break
}
}
@Palle举个例子就好了:)我认为这将是最好的解决方案。不可能有“内置”的方法来实现这一点,因为每个案例的关联值可能有一个不相关的类型。因此,您必须编写自己的函数(或计算变量)来获取相关值,以便指定类型(在您的情况下是协议,也可以是公共父类)。因此,我不认为可以完全避免切换,但这样的封装意味着您只需要编写一个切换:)@daltonclaybrook,谢谢,尽管遗憾的是,没有更简单的方法可以做到这一点。