[英]Swift get associated value in enums without switch
我有枚舉:
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
始終具有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
無論它是什么操作。 如果您關心操作,只需訪問operation
屬性即可。
func example(object: MSRetailRealm) {
let titleString = object.title
switch object.operation {
case .salesReturn:
break
case .demand:
break
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.