Как объявить оператор степени / степени с новой группой приоритетов в Swift 3?

В Swift 3 для Xcode 8 beta 6 произошли изменения, и теперь я не могу заявить о моём операторе, как раньше:

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

1 ответ

Решение

Ваш код уже компилируется и запускается - вам не нужно определять отношение приоритета или ассоциативность, если вы просто используете оператор в изоляции, как, например, в приведенном вами примере:

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

Полный список стандартных групп приоритетов библиотеки доступен в предложении развития.

Другие вопросы по тегам