簡體   English   中英

將枚舉與Swift中的關聯值進行比較

[英]Compare enums with associated values in Swift

對於具有關聯值的枚舉,Swift不提供相等運算符。 所以我實現了一個能夠比較兩個枚舉:

enum ExampleEnum{
     case Case1
     case Case2(Int)
     case Case3(String)
     ...
}

func ==(lhs: ExampleEnum, rhs: ExampleEnum) -> Bool {

    switch(lhs, rhs){
    case (.Case1, .Case1): return true
    case let (.Case2(l), .Case2(r)): return l == r
    case let (.Case3(l), .Case3(r)): return l == r
    ...
    default: return false
    }
}

我的問題是我有很多這樣的枚舉有很多案例所以我需要編寫很多這樣的比較代碼(對於每個枚舉,對於每種情況)。

如您所見,此代碼始終遵循相同的方案,因此似乎有一種更抽象的方式來實現比較行為。 有沒有辦法解決這個問題? 例如泛型?

目前沒有辦法在沒有寫出所有案例的情況下實現這一目標,我們希望在以后的版本中可以實現。

如果你真的有很多案例並且你不想全部寫出來,你可以編寫一個小函數來自動為你生成代碼(我最近一直在這樣做,因為這是不可能的。重構)

從Swift 4.2開始,只需添加Equatable協議一致性。 它將自動實施。

enum ExampleEquatableEnum: Equatable {
    case case1
    case case2(Int)
    case case3(String)
}

print("ExampleEquatableEnum.case2(2) == ExampleEquatableEnum.case2(2) is \(ExampleEquatableEnum.case2(2) == ExampleEquatableEnum.case2(2))")
print("ExampleEquatableEnum.case2(1) == ExampleEquatableEnum.case2(2) is \(ExampleEquatableEnum.case2(1) == ExampleEquatableEnum.case2(2))")

即默認比較采用帳戶中的相關值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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