swift 枚举中具有关联值的相等运算符重载
equality operator overloading in swift enums with associated values
我知道之前有人问过一个几乎类似的问题,但我无法对此发表评论,因为我是新来的。这就是我发布单独问题的原因。另外,我的问题是对上一个问题的扩展,旨在提供更通用的解决方案。也就是上一个问题的link: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
}
}
尽管 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
}
}
我不推荐这个:)
我知道之前有人问过一个几乎类似的问题,但我无法对此发表评论,因为我是新来的。这就是我发布单独问题的原因。另外,我的问题是对上一个问题的扩展,旨在提供更通用的解决方案。也就是上一个问题的link: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
}
}
尽管 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
}
}
我不推荐这个:)