【问题标题】:Is it possible to overload += operator in Swift?是否可以在 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解释为什么我认为它没有。

【问题讨论】:

    标签: ios swift operator-overloading operators overloading


    【解决方案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
      }
      

      【讨论】:

      • 请看我自己的回答
      • 是的,刚刚读过。有趣的是,我在测试我的代码时犯了和你一样的错误......幸运的是我已经知道该运算符存在:)
      • 很巧合 :) 谢谢你的回答
      猜你喜欢
      • 2012-09-04
      • 2010-10-20
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 2012-01-12
      • 2017-05-06
      • 2023-04-05
      相关资源
      最近更新 更多