Swift在没有开关的情况下获取枚举中的关联值

Evg*_*ban 7 ios swift

我有枚举:

enum RetailDemandReturnOperation {
    case salesReturn(value: MSRetailSalesReturnRealm)
    case demand(value: MSRetailDemandRealm)
}
Run Code Online (Sandbox Code Playgroud)

MSRetailDemandRealm并且MSRetailDemandRealm都实现相同的协议,具有变量标题和统计信息.我想提取这些值,但我不关心实际存储的是哪个对象.请考虑以下内容:

 switch data! {
        case .salesReturn(let object):
            titleString = object.title
            statistics = object.stats
        case .demand(let object):
            titleString = object.title
            statistics = object.stats
          break
        }
Run Code Online (Sandbox Code Playgroud)

我必须进入每个枚举值以获得协议的属性.我有什么方法可以做得更短更清洁?获取相关值,无论它是什么,只要它符合我的协议,并获得协议值?谢谢.

dal*_*ook 11

您可以向枚举中添加一个返回协议的属性.例如:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当您想要在枚举的特定值上访问这些属性时,只需使用:

let operation = RetailDemandReturnOperation.salesReturn(value: MSRetailSalesReturnRealm())
let title = operation.realm.title
Run Code Online (Sandbox Code Playgroud)

  • 我认为这将是最好的解决方案.不能有"内置"方式来执行此操作,因为每个案例的关联值可能具有不相关的类型.因此,您必须编写自己的函数(或计算变量)来获取相关值,以便指定类型(在您的情况下是协议,或者它可以是公共父类).所以我不认为可以完全避免切换,但这样的封装意味着你只需要编写一个开关:) (2认同)