Как объявить оператор степени / степени с новой группой приоритетов в 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
Полный список стандартных групп приоритетов библиотеки доступен в предложении развития.