簡體   English   中英

Swift在沒有開關的情況下獲取枚舉中的關聯值

[英]Swift get associated value in enums without switch

我有枚舉:

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
        }

我必須進入每個枚舉值以獲得協議的屬性。 我有什么方法可以做得更短更清潔? 獲取相關值,無論它是什么,只要它符合我的協議,並獲得協議值? 謝謝。

您可以向枚舉中添加一個返回協議的屬性。 例如:

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

現在,您可以訪問statstitle無論它是什么操作。 如果您關心操作,只需訪問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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM