操作员超载尚不支持?

Eri*_*rik 18 operator-overloading swift

根据Swift编程指南,操作符重载是允许的,实际上非常通用.但是,我一直无法让它在操场上工作.

例如,Equatable协议想要这样:func ==(lhs:Self, rhs:Self) -> Bool

假设我做了一个简单的Location3D结构:

struct Location3D
{
    var x : Double
    var y : Double
    var z : Double
}
Run Code Online (Sandbox Code Playgroud)

现在我希望这个Location3D实现Equatable协议,所以我将它与此方法一起添加:

func ==(lhs: Self, rhs: Self) -> Bool
{
    return lhs.x == rhs.x &&
           lhs.y == rhs.y &&
           lhs.z == rhs.z
}
Run Code Online (Sandbox Code Playgroud)

我得到运算符的编译错误只允许在全局范围内.咦?

所以我尝试添加@infix到函数中,将函数移动到扩展名,将类型更改为类而不是......一切都无济于事.

我错过了什么吗?您应该如何实施Equtable,Comparable何时运营商似乎无法运作?

hal*_*ski 40

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

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

struct Location3D : Equatable {
    // ...
}

func ==(lhs: Location3D, rhs: Location3D) -> Bool {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我想知道为什么苹果会让它变得如此不直观.如果您为给定的类重载了运算符,为什么要施加此限制?像其他方法一样,在类定义中定义运算符`func`是有意义的. (6认同)