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,谢谢,尽管遗憾的是,没有更简单的方法可以做到这一点。