Swift - 如何重载 Int 的 += 以在 nextPage(page: pageIndex += 1) 等函数调用中将运算符作为参数传递?

Wae*_*ael 0 math operator-overloading ios swift inout

我想知道如何执行以下操作:-

    // This is not correct
    func += (inout lhs: Int, rhs: Int) -> Int {
        return lhs + rhs
    }


Objective Usage:- scrollTo(pageIndex: pageIndex += 1)

Run Code Online (Sandbox Code Playgroud)

Pau*_*w11 6

您的代码很接近,但它需要做两件事:

  1. 将右侧添加到左侧
  2. 返回新值。

您的代码仅返回新值,不会更新左侧值。理论上,你可以使用这个:

func += (lhs: inout Int, rhs: Int) -> Int {
    lhs = lhs + rhs
    return lhs
}
Run Code Online (Sandbox Code Playgroud)

但还有一个问题;标准 += 运算符具有void返回类型,并且您已经定义了一个具有Int返回类型的新运算符。

+=如果您尝试在可接受 void 返回类型的上下文中使用该运算符(这是该运算符的正常使用),编译器将给出歧义错误,因为它无法确定应该使用哪个函数:

someIndex += 1   // This will give an ambiguity compile time error
Run Code Online (Sandbox Code Playgroud)

您可以通过使用泛型定义运算符来解决此问题,其中参数符合AdditiveArithmetic(感谢@NewDev 提供此提示):

someIndex += 1   // This will give an ambiguity compile time error
Run Code Online (Sandbox Code Playgroud)

然而,我必须说,当您只需两行代码时,这看起来确实会增加相当多的复杂性;首先增加pageIndex,然后调用该函数。

  • 您还可以通过使此重载使用泛型来解决这个问题,因此它相对于正常的 `+=` 具有较低的优先级: `func +=<T: AdditiveArithmetic>(lhs: inout T, rhs: T) -> T { ...}` (2认同)