是否可以在 Swift 中重载 += 运算符?

Posted

技术标签:

【中文标题】是否可以在 Swift 中重载 += 运算符?【英文标题】:Is it possible to overload += operator in Swift? 【发布时间】:2015-01-01 00:57:38 【问题描述】:

是否可以在 Swift 中重载 += 运算符以接受例如 CGFloat 参数?如果有,怎么做?

我的方法(如下)不起作用。

infix operator +=  associativity left precedence 140 
public func +=(inout left: CGFloat, right: CGFloat) 
    left = left + right


(编辑)重要提示:

上面的编码方法确实有效。请see my answer below解释为什么我认为它没有。

【问题讨论】:

【参考方案1】:

对不起,我的错。运算符 += 不需要为 CGFloat 参数重载,因为这样的重载包含在 Swift 中。我试图做类似的事情

let a: CGFloat = 1.5
a += CGFloat(2.1)

这失败了,因为我无法分配给let,而 XCode 显示的错误让我很困惑。

当然,我最初的问题(如下)中的方法适用于重载运算符。

infix operator +=  associativity left precedence 140 
public func +=(inout left: CGFloat, right: CGFloat) 
    left = left + right

请随时投票结束此问题。

【讨论】:

【参考方案2】:

CGFloat+= 运算符已经可用,所以你只需要使用它 - 如果你希望它以不同的方式运行,你唯一能做的就是覆盖现有的运算符,但这当然是气馁。

而且+=操作符本身已经存在,所以不需要再用这行声明:

infix operator +=  associativity left precedence 140 

只有当它是一个全新的运算符时,你才应该声明一个新的运算符,例如:

infix operator <^^>  associativity left precedence 140 

但是,如果您想为未定义的其他类型重载 += 运算符,这是正确的方法:

func += (inout lhs: MyType, rhs: MyType) 
    lhs = // Your implementation here

【讨论】:

请看我自己的回答 是的,刚刚读过。有趣的是,我在测试我的代码时犯了和你一样的错误......幸运的是我已经知道该运算符存在:) 很巧合 :) 谢谢你的回答

以上是关于是否可以在 Swift 中重载 += 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

c ++:是不是可以在派生类中定义重载运算符,这将工作objs基类类型

在 Swift 中使用相同的运算符(===)

Swift开发第六篇——操作运算符也可以重载& func 的参数修饰

Swift 运算符操作

Swift一些语法

Swift一些语法