Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用关联值在swift枚举中重载相等运算符_Swift_Enums_Operator Overloading_Equality - Fatal编程技术网

使用关联值在swift枚举中重载相等运算符

使用关联值在swift枚举中重载相等运算符,swift,enums,operator-overloading,equality,Swift,Enums,Operator Overloading,Equality,我知道早些时候有人问了一个几乎类似的问题,但我无法对此发表评论,因为我是新来的。这就是为什么我要发布一个单独的问题。此外,我的问题是对先前提出的问题的延伸,旨在找到更普遍的解决办法。这是上一个问题的链接: 我想测试具有关联值的枚举中的相等性: enum MyEnum { case None case Error case Function(Int) // it is a custom type but for briefness an Int here case

我知道早些时候有人问了一个几乎类似的问题,但我无法对此发表评论,因为我是新来的。这就是为什么我要发布一个单独的问题。此外,我的问题是对先前提出的问题的延伸,旨在找到更普遍的解决办法。这是上一个问题的链接:

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

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

这不会产生编译时错误,但在运行过程中会因错误的_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
    }
}

我不建议这样做:)

Oops,您已经注意到了递归(很抱歉没有仔细阅读这个问题)。让我们看看是否有更好的解决方案…仍然感谢您发布此消息!因为对于一个简短的枚举列表,这可能是最好且简单的解决方案。这是直截了当的。但是如果你有一长串的案例,我仍然想知道是否有更优雅(更短)的解决方案。因为一个非常简单的问题需要大量的写作。。。lhs等于rhsI刚才在这里添加了一个答案: