【问题标题】:Operator overloading not yet supported?还不支持运算符重载?
【发布时间】:2014-07-31 15:18:16
【问题描述】:

根据 Swift Programming Guide,运算符重载是允许的,而且实际上非常通用。但是,我无法让它在操场上工作。

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

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

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

【问题讨论】:

  • global scope 将指向任何类或扩展声明之外的位置

标签: operator-overloading swift


【解决方案1】:

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

在这种情况下,这意味着你声明你的结构符合协议,然后简单地在它的范围之外实现函数。

struct Location3D : Equatable {
    // ...
}

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

请参阅库参考以进行进一步讨论:

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

【讨论】:

  • 我想知道为什么苹果会让它如此不直观。如果要为给定类重载运算符,为什么要施加此限制?让运算符func 像其他方法一样在类定义内部定义是有意义的。
  • 请注意,如果struct 在一个类中,则运算符重载也必须超出该类的范围(真正的全局范围)。
  • == 是中缀运算符,覆盖的时候不需要指定,对吧?
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 2012-02-11
  • 2011-09-06
  • 1970-01-01
  • 2015-07-10
  • 2013-01-07
  • 2023-03-26
相关资源
最近更新 更多