根据Swift编程指南,允许运算符重载,实际上非常通用。但是,我一直无法让它在操场上工作。
例如,Equatable
协议想要这样:func ==(lhs:Self, rhs:Self) -> Bool
我们说我做了一个简单的Location3D
结构:
struct Location3D
{
var x : Double
var y : Double
var z : Double
}
现在我希望这个Location3D
实现Equatable
协议,所以我将它与此方法一起添加:
func ==(lhs: Self, rhs: Self) -> Bool
{
return lhs.x == rhs.x &&
lhs.y == rhs.y &&
lhs.z == rhs.z
}
我得到运算符的编译错误只允许在全局范围内。咦?
所以我尝试将@infix
添加到函数中,将函数移动到扩展名,将类型更改为类......所有都无济于事。
我错过了什么吗?当运营商似乎没有工作时,您应该如何实施Equtable
和Comparable
?
答案 0 :(得分:40)
您需要覆盖全局范围中的==运算符,但需要使用您的参数类型。
在这种情况下,它意味着您声明您的结构符合协议,然后只是在它的范围之外实现该功能。
struct Location3D : Equatable {
// ...
}
func ==(lhs: Location3D, rhs: Location3D) -> Bool {
// ...
}
有关进一步讨论,请参阅库参考: