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

时间:2017-12-05 17:16:13

标签: ios swift

我有枚举:

enum RetailDemandReturnOperation {
    case salesReturn(value: MSRetailSalesReturnRealm)
    case demand(value: MSRetailDemandRealm)
}

MSRetailDemandRealmMSRetailDemandRealm都实现了相同的协议,它们具有变量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
        }

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

2 个答案:

答案 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 }
}

现在,无论采取何种操作,您都可以访问statstitle。如果您关心操作,只需访问operation属性。

func example(object: MSRetailRealm) {
    let titleString = object.title
    switch object.operation {
        case .salesReturn:
            break
        case .demand:
            break
    }
}