操作员超载尚不支持?

时间:2014-06-10 18:14:52

标签: operator-overloading swift

根据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添加到函数中,将函数移动到扩展名,将类型更改为类......所有都无济于事。

我错过了什么吗?当运营商似乎没有工作时,您应该如何实施EqutableComparable

1 个答案:

答案 0 :(得分:40)

您需要覆盖全局范围中的==运算符,但需要使用您的参数类型。

在这种情况下,它意味着您声明您的结构符合协议,然后只是在它的范围之外实现该功能。

struct Location3D : Equatable {
    // ...
}

func ==(lhs: Location3D, rhs: Location3D) -> Bool {
    // ...
}

有关进一步讨论,请参阅库参考:

https://developer.apple.com/documentation/swift/equatable