簡體   English   中英

具有相關值的swift枚舉中的等於運算符重載

[英]equality operator overloading in swift enums with associated values

我知道之前有一個幾乎相似的問題,但是我無法對此發表評論,因為我是新來的。 這就是我發布分離問題的原因。 此外,我的問題是對上一個問題的擴展,旨在提供更一般的解決方案。 這是前一個問題的鏈接: 如何測試Swift枚舉與相關值的相等性

我想在枚舉中測試相關值的相等性:

enum MyEnum {
    case None
    case Error
    case Function(Int) // it is a custom type but for briefness an Int here
    case ...
}

我試着設置一個重載函數,如下所示

func ==(a: MyEnum, b: MyEnum) -> Bool {
    switch (a,b) {
    case (.Function(let aa), .Function(let bb)):
        if (aa==bb) {
            return true
        } else {
            return false
        }
    default:
        if (a == b) {
            return true
        } else {
            return false
        }
    }
}

這不會產生編譯時錯誤,但在運行過程中會因bad_exec而失敗。 很可能是因為在默認情況下測試a == b,再次調用函數本身。 .Function部分按預期工作,但不是其余的...所以案例列表有點長,我如何測試與它們沒有相關值的案例是否相等?

在您的實施中,

if (a == b) {

遞歸地再次調用相同的==函數。 這最終會因堆棧溢出而崩潰。

例如,一個有效的實施方案是:

func ==(a: MyEnum, b: MyEnum) -> Bool {
    switch (a,b) {
    case (.Function(let aa), .Function(let bb)):
        return aa == bb
    case (.Error, .Error):
        return true
    case (.None, .None):
        return true
    default:
        return false
    }
}

雖然memcmp有效:

func ==(var a: MyEnum, var b: MyEnum) -> Bool {
    switch (a,b) {
    case (.Function(let aa), .Function(let bb)):
        return aa == bb
    default:
        return memcmp(&a, &b, sizeof(MyEnum)) == 0
    }
}

我不推薦這個:)

暫無
暫無

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

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