Как использовать ** для показателей, использующих @infix func **()?

Я хочу использовать ** перегружать функцию экспоненты. Я работаю, если я использую что-то вроде "^", но Python делает ** и я хотел бы использовать это с Swift. Есть ли способ сделать это?

ошибка: реализация оператора без соответствующего объявления оператора

@infix func ** (num: Double, power: Double) -> Double{
    return pow(num, power)
}

println(8.0**3.0) // Does not work

2 ответа

Решение

Вам необходимо объявить оператор перед определением функции следующим образом:

В Swift 2:

import Darwin

infix operator ** {}

func ** (num: Double, power: Double) -> Double {
    return pow(num, power)
}

println(8.0 ** 3.0) // works

В Swift 3:

import Darwin

infix operator **

func ** (num: Double, power: Double) -> Double {
    return pow(num, power)
}

print(8.0 ** 3.0) // works

Чтобы убедиться, что ** выполняется перед соседними * или /, лучше установить приоритет.

infix operator ** { associativity left precedence 160 }

Как показывает http://nshipster.com/swift-operators/, экспоненциальные операторы имеют приоритет 160, как и операторы побитового сдвига << и >>.

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