9

There's been a change in Swift 3 for Xcode 8 beta 6 and now I'm not able to declare my operator for power as I did before:

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

I've read a bit about it and there's a new change been introduced in Xcode 8 beta 6

From this I'm guessing I have to declare a precedence group and use it for my operator like this:

precedencegroup ExponentiativePrecedence {}

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

Am I going in the right direction to make this work? What should I put inside the {} of the precedence group?

My final aim is to be able to make power operations with a simple operator in swift, e.g.:

10 ^^ -12
10 ^^ -24
Hamish
  • 69,859
  • 16
  • 167
  • 245
gbdavid
  • 1,449
  • 16
  • 31

1 Answers1

10

Your code already compiles and runs – you don't need to define a precedence relationship or an associativity if you're simply using the operator in isolation, such as in the example you gave:

10 ^^ -12
10 ^^ -24

However, if you want to work with other operators, as well as chaining together multiple exponents, you'll want to define a precedence relationship that's higher than the MultiplicationPrecedence and a right associativity.

precedencegroup ExponentiativePrecedence {
    associativity: right
    higherThan: MultiplicationPrecedence
}

Therefore the following expression:

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

will be evaluated as:

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

The full list of standard library precedence groups is available on the evolution proposal.

Hamish
  • 69,859
  • 16
  • 167
  • 245