具有相关值的swift枚举中的等于运算符重载

时间:2015-03-09 11:51:09

标签: swift enums operator-overloading equality

我知道之前曾问过一个几乎相似的问题,但我无法对此发表评论,因为我是新来的。这就是我发布分离问题的原因。此外,我的问题是对上一个问题的扩展,旨在提供更一般的解决方案。这是上一个问题的链接:How to test equality of Swift enums with associated values

我想测试具有关联值的枚举中的相等性:

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部分按预期工作,但不是其余部分...所以案例列表有点长,我如何测试与它们没有相关值的案例是否相等?

2 个答案:

答案 0 :(得分:3)

在您的实施中,

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

答案 1 :(得分:0)

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

我不推荐这个:)