不使用switch语句,如何在Swift中获取枚举类型的关联值。

15

我有一个枚举:

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
        }

我需要进入每个枚举值来获取协议属性,有没有更简短、更清晰的方法?获取关联值,无论它是什么,只要符合我的协议,就可以获取协议值?谢谢。


@Palle 一个例子会很棒 :) - Evgeniy Kleban
2个回答

16
您可以向枚举中添加一个属性,该属性返回协议。例如:
您可以向枚举中添加一个属性,该属性返回协议。例如:

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

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

2
我认为这将是最好的解决方案。因为每个情况的相关值可能具有不相关的类型,所以不能有一种“内置”的方法来实现此操作。因此,您需要编写自己的函数(或计算变量)来获取相关值,以指定类型(在您的情况下是协议,或者也可以是共同的父类)。因此,我认为无法完全避免使用switch,但像这样封装意味着您只需要编写一个switch :) - TMin
1
@daltonclaybrook 谢谢,虽然没有更简单的方法做到这一点,但这很令人遗憾。 - Evgeniy Kleban

-1

由于 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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接