我知道之前曾问过一个几乎类似的问题,但是我无法对此发表评论,因为我是新来的。这就是我发布分离问题的原因。另外,我的问题是对先前提出的问题的扩展,旨在提供一个更通用的解决方案。这是上一个问题的链接: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部分按预期运行,但其余部分则无法正常运行。因此,案例列表会更长一些,如​​何测试没有关联值的案例是否相等?

最佳答案

在您的实现中,

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

关于swift - 带有关联值的快速枚举中的等式运算符重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28941326/

10-12 19:10