9

Xcode 8 beta 6 的 Swift 3 发生了变化,现在我无法像以前那样声明我的操作员的权力:

infix operator ^^ { }
public func ^^ (radix: Double, power: Double) -> Double {
    return pow((radix), (power))
}

我已经阅读了一些关于它的内容,并且在 Xcode 8 beta 6 中引入了一个新的变化

由此我猜我必须声明一个优先组并将其用于我的运算符,如下所示:

precedencegroup ExponentiativePrecedence {}

infix operator ^^: ExponentiativePrecedence
public func ^^ (radix: Double, power: Double) -> Double {
    return pow((radix), (power))
}

我是否朝着正确的方向进行这项工作?我应该在优先组的 {} 中放入什么?

我的最终目标是能够使用简单的运算符快速进行电源操作,例如:

10 ^^ -12
10 ^^ -24
4

1 回答 1

10

您的代码已经编译并运行——如果您只是单独使用运算符,则不需要定义优先关系或关联性,例如在您给出的示例中:

10 ^^ -12
10 ^^ -24

但是,如果您想与其他运算符一起工作,以及将多个指数链接在一起,您将需要定义一个高于MultiplicationPrecedence右关联性的优先关系。

precedencegroup ExponentiativePrecedence {
    associativity: right
    higherThan: MultiplicationPrecedence
}

因此下面的表达式:

let x = 2 + 10 * 5 ^^ 2 ^^ 3

将被评估为:

let x = 2 + (10 * (5 ^^ (2 ^^ 3)))
//          ^^    ^^    ^^--- Right associativity
//          ||     \--------- ExponentiativePrecedence > MultiplicationPrecedence
//           \--------------- MultiplicationPrecedence > AdditionPrecedence,
//                            as defined by the standard library

标准库优先级组的完整列表可在进化提案中找到。

于 2016-08-24T08:09:26.280 回答